Я пытаюсь решить игру жизни Конвея в C ++. Таким образом, согласно моей схеме, у меня есть класс ячейки, который содержит список из 8 соседей, который сам является объектом типа ячейка. Это нормально делать это. Код выглядит так
class Cell {
private:
int position_row_;
int position_colm_;
std::shared_ptr<State> state_;
std::vector<Cell> neighbours_;
};
Теперь другой вопрос, который меня беспокоит, что это за тип отношений. При проектировании я думал, что это «Агрегация»; но сейчас я так не думаю.
Может кто-нибудь уточнить, пожалуйста?
std::vector<Cell> neighbours;
Вы храните копию соседей. Что если состояние любого соседа изменится? Вам нужно, чтобы это изменение было отражено в векторе? Если да, лучше хранить указатели на соседей:
std::vector<std::shared_ptr<Cell>> neighbours;
Класс не может включать себя в качестве члена данных class C { C c; };
по двум причинам:
Класс может содержать вектор самого себя class C { std::vector<C> vec; };
потому что, как и указатель, объявление вектора требует только того, чтобы тип данных был объявлен, а не определен.
Ваш код будет скомпилирован и запущен, но вы сказали, что ваше намерение было агрегировать, а это не так:
std::vector<Cell> neighbours;
это случай состав потому что объекты в векторе принадлежат объекту Cell.std::vector<Cell*> neighbours;
будет случай агрегирование потому что объект Cell будет использовать объекты в векторе, но не будет владеть ими.Это считается рефлексивной ассоциацией. Поскольку он удовлетворяет следующим условиям, имеет собственный тип и имеет переменную-член
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)
Это может привести к цепочке ассоциаций
Связанный объект (член) может знать или не знать о существовании объекта (класса)