oop — C ++: может ли класс иметь объект своего собственного типа?

Я пытаюсь решить игру жизни Конвея в C ++. Таким образом, согласно моей схеме, у меня есть класс ячейки, который содержит список из 8 соседей, который сам является объектом типа ячейка. Это нормально делать это. Код выглядит так

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

std::vector<Cell> neighbours_;
};

Теперь другой вопрос, который меня беспокоит, что это за тип отношений. При проектировании я думал, что это «Агрегация»; но сейчас я так не думаю.
Может кто-нибудь уточнить, пожалуйста?

1

Решение

std::vector<Cell> neighbours;

Вы храните копию соседей. Что если состояние любого соседа изменится? Вам нужно, чтобы это изменение было отражено в векторе? Если да, лучше хранить указатели на соседей:

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

Другие решения

Класс не может включать себя в качестве члена данных class C { C c; }; по двум причинам:

  1. Когда вы пытаетесь определить элемент данных, класс по-прежнему является неполным типом.
  2. Вы создаете бесконечную цепочку объектов, которая требует бесконечной памяти.

Класс может содержать вектор самого себя class C { std::vector<C> vec; }; потому что, как и указатель, объявление вектора требует только того, чтобы тип данных был объявлен, а не определен.

Ваш код будет скомпилирован и запущен, но вы сказали, что ваше намерение было агрегировать, а это не так:

  • Ваш код std::vector<Cell> neighbours; это случай состав потому что объекты в векторе принадлежат объекту Cell.
  • Использование указателей на другие объекты Cell std::vector<Cell*> neighbours; будет случай агрегирование потому что объект Cell будет использовать объекты в векторе, но не будет владеть ими.
1

Это считается рефлексивной ассоциацией. Поскольку он удовлетворяет следующим условиям, имеет собственный тип и имеет переменную-член

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)

Это может привести к цепочке ассоциаций
Связанный объект (член) может знать или не знать о существовании объекта (класса)

0