C ++: неявный связанный список - PullRequest
0 голосов
/ 22 марта 2011

Почему это не более популярная идиома / паттерн?

#include <list>
class A {
  int data;
  static std::list<A*> glist;
public: 
  A():data(0) {
    glist.push_back(this);
  }
  ~A() {
    glist.remove(this);
  }
};

Это как сеть безопасности. Вы можете удалить экземпляр A из любого указателя на него, и список управляет собой. Разве это не намного лучше, чем создавать отдельные контейнеры для отслеживания ваших A и ошибок при их управлении? Я предполагаю, что делаю большое дело из чего-то действительно простого. Но держу пари, это могло бы сэкономить мне много времени отладки в прошлом

Ответы [ 2 ]

2 голосов
/ 22 марта 2011

Проблемой будет ключевое слово static. Вы можете иметь только один глобальный список - без отдельных списков, поскольку ключевое слово static будет гарантировать, что все экземпляры вашего класса A будут принадлежать одному и только списку; Вы не сможете создавать отдельные списки А. Если это действительно ваше намерение, то это должно быть хорошо. Однако я также добавил бы, что здесь есть ненужная избыточность - std :: list внутренне управляет этими вещами для вас - я не понимаю, почему вы захотите добавить дополнительный слой абстракции над ним.

0 голосов
/ 22 марта 2011

Это не потокобезопасно. Иногда вы уже ведете список объектов и вам все равно. Объекты в стеке на самом деле не нужно отслеживать в другом контейнере. Он вводит новую зависимость вашего класса, которая может не понадобиться. Я уверен, что есть еще много причин, которые я пропустил.

Проблемы управления объектами не возникают, если вы используете shared_ptr или ptr-контейнеры boost.

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