Программирование игр
/ GameDev.ru / Программирование / Подсказки / Класс, который знает все свои экземпляры

Класс, который знает все свои экземпляры

Автор: Василий Густелев

Класс, который знает все свои экземпляры. Решение конечно известное, но очень поможет новичкам.

class ClassWhoKnowsAllHisInstances
{
private:  
  static std::list<  ClassWhoKnowsAllHisInstances* > classList;

public:
  ClassWhoKnowsAllHisInstances()
  {  
    classList.push_back(this);
  }; 
  ~ClassWhoKnowsAllHisInstances()
  {  
    std::list< ClassWhoKnowsAllHisInstances* >::iterator it;
    it=(std::find(classList.begin(), classList.end(), 
        ( ClassWhoKnowsAllHisInstances* ) this));
    if(it!=classList.end())
      classList.erase(it);
  };
};

Если экземпляров предвидится много, то вместо std::list лучше использовать какой-нибудь ассоциативный контейнер для ускорения поиска.

12 октября 2009

Категории: C++

Права на документ принадлежат автору, указывайте ссылку при цитировании

Комментарии:

Страницы: 1 2 3 Следующая

dipПостоялецwww12 окт. 200920:00#1
И не только свои, но и всех своих наследников...
MarkoPoloПостоялецwww12 окт. 200920:05#2
Честно сказать, до такого додуматься не проблема...
KpeHDeJIbУчастникwww12 окт. 200920:30#3
Извините пожалуйста, можно нескромный вопрос, нах оно надо?
PushkoffУчастникwww12 окт. 200920:35#4
мои любимые миксины
template< class T >
class ClassWhoKnowsAllHisInstances
{
   static std::list<  T* > classList;
public:
  ClassWhoKnowsAllHisInstances()
  {  
    classList.push_back((T *)this);
  }; 
  ~ClassWhoKnowsAllHisInstances()
  {  
    std::list< T* >::iterator it;
    it=(std::find(classList.begin(), classList.end(), 
        ( T* ) this));
    if(it!=classList.end())
      classList.erase(it);
  };
};

class MyClassWithListOfAllInstances : public ClassWhoKnowsAllHisInstances< MyClassWithListOfAllInstances>
{

};

class OtherClassWhoKnowsAllItInstances : public ClassWhoKnowsAllHisInstances< OtherClassWhoKnowsAllItInstances >
{

};

Последняя правка: 12 окт. 2009 20:38

WraithПостоялецwww12 окт. 200920:45#5
Жесть какая... Да еще и с ошибкой.
    if(it!=classList.end())
      (*it)=0;
Это не удаляет ноду из списка, поэтому посоздавав экземпляров можно загадить всю память списком длиной в 100 миллионов нод. Линейный поиск по списку в 100 миллионов нод тоже не подарок.

my.nameПостоялецwww13 окт. 20090:07#6
не совсем понятно зачем объекту надо знать свои экземпляры, я могу понять менеджеру создавшему обекты, но сомещать и менеджер обектов и сам обект немного странно.
innuendoПостоялецwww13 окт. 20099:51#7
my.name
> не совсем понятно зачем объекту надо знать свои экземпляры
класс знает свои экземпляры, вместо менеджера методы класса ( хотя и не очень кузяво )
например, сделать broadcast для всех экземпляров

Последняя правка: 13 окт. 2009 9:52

NikopolМодераторwww13 окт. 200910:27#8
Wraith
> Да еще и с ошибкой.
Кстати да, спасибо.
Что-то вчера я совсем уже никакой это дело одобрял...

Исправил.

NikopolМодераторwww13 окт. 200910:30#9
Wraith
> Линейный поиск по списку в 100 миллионов нод тоже не подарок.

Ок, добавил в подсказку замечание.

NikopolМодераторwww13 окт. 200910:31#10
MarkoPolo
> Честно сказать, до такого додуматься не проблема...

Подсказка для новичков же.

KlounУчастникwww23 окт. 200912:09#11
>Если экземпляров предвидится много, то вместо std::list лучше использовать какой-нибудь ассоциативный контейнер для ускорения поиска.
ИМХО тут больше всего подходит std::set
innuendoПостоялецwww23 окт. 200912:13#12
Kloun
> ИМХО тут больше всего подходит std::set

отцы сказали - юзать std::set низяяя ни в коем случае, он плохо на карму действует :)
 

KlounУчастникwww23 окт. 200912:18#13
innuendo
> отцы сказали - юзать std::set низяяя ни в коем случае, он плохо на карму
> действует :)
серьезно? а я тыкаю где не поподя ;( теперь гореть мне в аду???
cNoNimУчастникwww23 окт. 200912:22#14
помойму это из области К.О. не?
я бы понял еще еслиб сдесь какиенить умные указатели разберали

Страницы: 1 2 3 Следующая

/ Форум / Программирование игр / Общее

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

2001—2010 © GameDev.ru — Разработка игр