C ++: управление набором объектов, чтобы удерживаемые объекты могли получить доступ к структуре данных, содержащей их - PullRequest
2 голосов
/ 29 ноября 2011

Я храню указатели на все экземпляры класса Cell в связанном списке. std::list<Cell*> cells хранится в классе с именем Game. Метод Game::update() повторяет все экземпляры Cell, содержащиеся в списке cells, и вызывает метод Cell::update() каждой ячейки. Если метод Cell::update() обнаруживает в какой-то момент, что ячейка готова к делению, ему необходимо push_back() указатель на новую ячейку на cells, чтобы новая ячейка была обновляемой. Но как я могу сослаться на Game::cells в cell, чтобы сделать это? Я рассмотрел следующие варианты:

  • Определение std::list<Cell*> cells в глобальной области видимости.
    • противно и делает невозможным иметь более одного Game
  • Создание std::list<Cell*> cells статического члена Cell
    • лучше, чем глобальная переменная, но все еще не позволяет использовать несколько Game экземпляров
  • Передача ссылки на текущую игру Game::cells в качестве параметра конструктору ячейки и последующее сохранение копии этой ссылки во вновь созданном экземпляре ячейки
    • Я думаю, что это немного негибко
  • Передача ссылки на Game::cells текущей игры в качестве параметра для метода Cell::update()

Есть ли более элегантные решения для использования?

Ответы [ 4 ]

4 голосов
/ 29 ноября 2011

Я бы не стал вводить ненужную зависимость между Cell и Game, если бы Game просто вызывал методы на Cell s и удерживал их экземпляры.

Вместо этого вы могли бы вернутьновые Cell s (или ни одного) из Cell::update() и пусть Game решит, что делать, скорее всего, добавьте их в список.Вы также можете определить новую функцию для этого в Cell, что-то вроде Cell::splitCell() и позволить Cell::update() обновлять только свойства Cell объектов (как следует из названия).

2 голосов
/ 29 ноября 2011

Я бы, вероятно, передал ссылку на Game в Cell::update(), а затем сказал бы объекту Game делить ячейку, но другие варианты могут быть лучше, так как я все еще не думаю, что у меня есть полная картина того, что выобщая цель.

0 голосов
/ 29 ноября 2011

Если объекты Cell должны знать, какому объекту Game они принадлежат, получить класс из std :: list <> и включить указатель на Game (Game *) в качестве члена Cell.Объект ячейки может затем использовать этот указатель, чтобы добавить еще одну ячейку в игру.

class Game
{
      class Cell
      {
           public:
           Game *game;
      };
      class Cells : public std::list<Cell *>
      {
            Game *game;
            operator += (Cell *cell) {cell->game = this->game; ....}
      };
      Cells cells;
};
0 голосов
/ 29 ноября 2011

Передайте ссылку на Game в конструктор Cell.Затем создайте функцию, которая позволит Cell помещать другие Cell объекты в список (или сделать Cell классом друга из Game, чтобы он мог обращаться к списку напрямую).

Таким образом, Cell может решить, когда ему нужно разделиться, но он может делегировать действие объекту Game, к которому он относится.

Кроме того, если есть какие-то будущие вещи, которые Cell может захотетьGame для этого у него уже есть нужный предмет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...