C ++:一个类可以拥有它自己类型的对象吗?

时间:2014-11-15 16:02:31

标签: c++ oop conways-game-of-life

我正试图用c ++来解决康威的生活游戏。所以根据我的设计,我有一个包含8个邻居列表的单元类,它本身就是cell类型的对象。这样做是否可以。代码看起来像这样

class Cell {
private:
  int position_row_;
  int position_colm_;
  std::shared_ptr<State> state_;

  std::vector<Cell> neighbours_;
};

现在,另一个困扰我的问题是,它是什么类型的关系。在设计时我认为它是'聚合';但现在我不这么认为。 请有人澄清一下吗?

3 个答案:

答案 0 :(得分:2)

std::vector<Cell> neighbours;

您正在存储邻居的副本。如果任何邻居的状态改变怎么办?您是否需要将此更改反映到向量中?如果是,请更好地存储指向邻居的指针:

std::vector<std::shared_ptr<Cell>> neighbours;

答案 1 :(得分:1)

由于两个原因,类不能将自己包含为数据成员class C { C c; };

  1. 当您尝试定义数据成员时,该类仍然是不完整的类型。
  2. 您正在创建一个无限的对象链,这些对象需要无限的内存。
  3. 类可以包含自身class C { std::vector<C> vec; };的向量,因为像指针一样,向量声明只要求声明数据类型 - 未定义。

    您的代码将编译并运行,但您说您的意图是聚合,但并非如此:

    • 您的代码std::vector<Cell> neighbours; composition 的一种情况,因为向量中的对象归Cell对象所有。
    • 使用指向其他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)

这可能会导致一系列联想     关联对象(成员)可能知道也可能不知道对象(类)的存在