OOP - 在类

时间:2017-11-19 20:50:19

标签: c++ oop design-patterns solid-principles

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

我需要在两个类之间共享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”类中,因此生命周期很明确。组件之间的通信基于节俭。

1 个答案:

答案 0 :(得分:1)

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

如果你的代码训练有素,那可能不是问题。但是如果你的代码超过 - - 一个程序员正在处理它,它有点脆弱,因为暗示了共享所有权,并且GameInfoList的生命周期超出了GameInfo和GameInfoProvider的控制范围。

要解决“谁拥有GameInfoList,无论如何?”问题,您可以使用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也有帮助。