OOP - 在 类 之间共享数据

OOP - sharing data between classes

我有一个 class 用于保存数据并提供访问该数据的方法:GameInfoList。基于3个接口创建数据:A,B,C。我也有2个接口来获取特定数据:D,E。

我需要在两个 class 之间共享 GameInfoList,这是我的方法:

//fills GameInfoList based on interfaces called by the different clients.
class GameInfo: public A, public B, public C
{
public:
    GameInfo(GameInfoList&)
    //A,B,C impl
private:
    GameInfoList& gameInfoList; 
};

//reads GameInfoList and allow to get a particular info.
class GameInfoProvider: public D, public E
{
public:
    GameInfoProvider(const GameInfoProvider&)
    //D,E impl
private:
    const GameInfoList& gameInfoList; 
};

有没有参考上述场景的设计模式? 你觉得我的方法怎么样?

编辑 GameInfoList、GameInfo 和 GameInfoProvider 对象存在于 "Component" class 中,因此生命周期清晰。组件之间的通信基于节俭。

这是控制模式的反转。它在 C++ 中的问题是 GameInfoList 没有明确的所有权。

如果您的代码纪律严明,这可能不是问题。但是如果你的代码有超过 -- oh -- 一个程序员在处理它,它就有点脆弱,因为共享所有权是隐含的,并且 GameInfoList 的生命周期不受双方的控制GameInfo 和 GameInfoProvider。

要解决 "who all owns GameInfoList, anyway?" 问题,您可以使用 std::shared_ptr<GameInfoList> 这样 GameInfoList 的所有权就非常清楚了。

//fills GameInfoList based on interfaces called by the different clients.
class GameInfo: public A, public B, public C
{
public:
    GameInfo(std::shared_ptr<GameInfoList>)
    //A,B,C impl
private:
    std::shared_ptr<GameInfoList> gameInfoList; 
};

//reads GameInfoList and allow to get a particular info.
class GameInfoProvider: public D, public E
{
public:
    GameInfoProvider(std::shared_ptr<GameInfoList>)
    //D,E impl
private:
    std::shared_ptr<GameInfoList> gameInfoList; 
};

请注意,GameInfoProvider 丢失了其使用 GameInfoList 的常量性。不幸的是,我试图像上面那样表达共享所有权。

如果您使用 std::shared_ptr<const GameInfoList>,会将 GameInfoList 视为不可变值对象,但您也必须在 GameInfo 中以这种方式表示它。

在 C++ 中,在实例对象中引用成员变量还有其他缺点。 std::shared_ptr 也有帮助。