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 也有帮助。
我有一个 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 也有帮助。