【问题标题】:OOP - sharing data between classes [closed]OOP - 在类之间共享数据 [关闭]
【发布时间】:2017-11-19 20:50:18
【问题描述】:

我有一个保存数据并公开访问该数据的方法的类: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 对象存在于“组件”类中,因此生命周期是明确的。组件之间的通信是基于 thrift 的。

【问题讨论】:

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


    【解决方案1】:

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

    如果您的代码纪律严明,那可能不是问题。但是如果你的代码有超过 -- oh -- 一个程序员在处理它,它有点脆弱,因为共享所有权是隐含的,而且 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&lt;const GameInfoList&gt;,则将 GameInfoList 视为不可变值对象,但您也必须在 GameInfo 中以这种方式表示。

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

    【讨论】:

    • 请参阅编辑
    • 第一个问题:控制反转。对于你的第二个问题:没关系,我会使用 C++11 std::shared_ptr 而不是引用成员变量。
    猜你喜欢
    • 1970-01-01
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2020-04-08
    • 2018-11-09
    • 1970-01-01
    • 1970-01-01
    • 2019-07-02
    相关资源
    最近更新 更多