创建系统范围的资源C++

Creating a system wide resource C++

本文关键字:资源 C++ 范围 系统 创建      更新时间:2023-10-16

我在设计软件时遇到问题。我有一个非常大的对象(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);
    // ...
};