我正试图用c ++来解决康威的生活游戏。所以根据我的设计,我有一个包含8个邻居列表的单元类,它本身就是cell类型的对象。这样做是否可以。代码看起来像这样
class Cell {
private:
int position_row_;
int position_colm_;
std::shared_ptr<State> state_;
std::vector<Cell> neighbours_;
};
现在,另一个困扰我的问题是,它是什么类型的关系。在设计时我认为它是'聚合';但现在我不这么认为。 请有人澄清一下吗?
答案 0 :(得分:2)
std::vector<Cell> neighbours;
您正在存储邻居的副本。如果任何邻居的状态改变怎么办?您是否需要将此更改反映到向量中?如果是,请更好地存储指向邻居的指针:
std::vector<std::shared_ptr<Cell>> neighbours;
答案 1 :(得分:1)
由于两个原因,类不能将自己包含为数据成员class C { C c; };
:
类可以包含自身class C { std::vector<C> vec; };
的向量,因为像指针一样,向量声明只要求声明数据类型 - 未定义。
您的代码将编译并运行,但您说您的意图是聚合,但并非如此:
std::vector<Cell> neighbours;
是 composition 的一种情况,因为向量中的对象归Cell对象所有。std::vector<Cell*> neighbours;
的指针将是聚合的情况,因为Cell对象将使用向量中的对象但不拥有它们。答案 2 :(得分:0)
这被认为是Reflexive Association。因为它拥有自己的类型具有成员变量
,所以满足以下条件The associated object (member) is otherwise unrelated to the object (class)
The associated object (member) can belong to more than one object (class) at a time
The associated object (member) does not have its existence managed by the object (class)
这可能会导致一系列联想 关联对象(成员)可能知道也可能不知道对象(类)的存在