创建系统范围的资源C++
Creating a system wide resource C++
我在设计软件时遇到问题。我有一个非常大的对象(BO),比如说一个动态数组的映射,我需要跨各种类访问它。每次类使用 BO 时,它都会向其添加新数据,或使用 BO 中的某些数据进行计算。
作为一个新手,我不知道如何在C++中设计这样一个对象,以便我的代码设计和架构很好。制作全局变量不够有效,在 Singleton 上进行了研究,但发现规则是你只能访问对象,不能更改它。
任何人都可以指出我正确的方向吗? 我应该遵循哪种设计模式,最有效和可扩展?
谢谢
根据这里的答案,以下设计是否正确 - 它是 psudo!
Class BigObject {
private static BigObject instance = null;
private map;
private BigObject() { }
public static BigObject getInstance() {
if (instance == null) {
instance = new BigObject();
}
return instance;
}
public getArray(string key) {
return map[key];
}
public setBigObject(string key, Array value) {
map.insert(key, value);
}
"但发现规则是你只能访问对象,不能更改它。
你可能误解了那里的一些东西?
单例的唯一目的是保证具有类的单个实例。您仍然可以在其类成员函数允许的范围内更改其状态。
关于您在更新问题中发布的单例实现,您应该对其进行改进以使其线程安全(遵循 Scott Meyer 的单例):
class BigObject {
std::map<std::string,Array> map;
BigObject() { }
public:
static BigObject& getInstance() {
static BigObject instance;
return instance;
}
const Array& getArray(std::string key) const {
return map[key];
}
void setBigObject(string key, Array value) {
map.insert(key, value);
}
};
但是,由于 Singleton 将客户端代码与 singleton 类紧密耦合,您可能应该为BigObject
声明一个接口,在需要访问的类中获取引用,并从构造中传递一个实例:
struct IBigObject {
virtual void doCostlyCalculations() = 0;
virtual void updateData(std::vector<int> record) = 0;
virtual ~IBigObject() {}
};
class BigObject : public IBigObject {
virtual void doCostlyCalculations() {
// Implementation ...
}
virtual void updateData(std::vector<int> record) {
// Implementation ...
}
};
class ClientA {
IBigObject& bo_;
public:
ClientA(IBigObject& bo) : bo_(bo) {}
}
class ClientB {
IBigObject& bo_;
public:
ClientA(IBigObject& bo) : bo_(bo) {}
}
int main() {
BigObject bo;
ClientA ca(bo);
ClientB cb(bo);
// ...
};
相关文章:
- 具有瞬态资源的RAII类
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 允许从 std::map 的密钥窃取资源?
- 参考资源文件VC++中的$(SolutionDir)
- 如何维护资源管理器项目视图中当前可见的项目列表
- 将 std::allocate_shared 与多态资源分配器一起使用
- 使用RAII在给定次数的迭代后重新分配资源
- 资源管理设计模式
- 如何跨平台将二进制资源构建到程序中?
- SetDlgItemInt 不会更改嵌入资源的编辑框
- Klocwork Inside的资源泄漏
- 从存储为 Windows 资源 (c++) 的 png 中获取 png 文件数据
- C++链接时间资源"allocation"而不定义
- 使用 Bazel 生成 QT 资源文件
- 编译器资源管理器和 GCC 具有不同的输出
- 使用 Bazel 编译 QT 应用程序时访问资源
- 根据需要声明资源,而不重复它们
- meson-build:wxWidgets 资源文件,用于 Windows 未构建
- Windows 资源管理器中的图标在使用 resource.rc 时显示 2 个不同的图标
- C++ 返回异常,我应该释放资源吗?