Войти
ПрограммированиеПодсказкиОбщееОбщее

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

Автор:

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

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 лучше использовать какой-нибудь ассоциативный контейнер для ускорения поиска.

#C++

12 октября 2009

Комментарии [42]

Страницы: 1 2 3 Следующая »
#1
20:00, 12 окт. 2009

И не только свои, но и всех своих наследников...

#2
20:05, 12 окт. 2009

Честно сказать, до такого додуматься не проблема...

#3
20:30, 12 окт. 2009

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

#4
20:35, 12 окт. 2009

мои любимые миксины

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 >
{

};

#5
20:45, 12 окт. 2009

Жесть какая... Да еще и с ошибкой.

    if(it!=classList.end())
      (*it)=0;
Это не удаляет ноду из списка, поэтому посоздавав экземпляров можно загадить всю память списком длиной в 100 миллионов нод. Линейный поиск по списку в 100 миллионов нод тоже не подарок.

#6
0:07, 13 окт. 2009

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

#7
9:51, 13 окт. 2009

my.name
> не совсем понятно зачем объекту надо знать свои экземпляры
класс знает свои экземпляры, вместо менеджера методы класса ( хотя и не очень кузяво )
например, сделать broadcast для всех экземпляров

#8
10:27, 13 окт. 2009

Wraith
> Да еще и с ошибкой.
Кстати да, спасибо.
Что-то вчера я совсем уже никакой это дело одобрял...

Исправил.

#9
10:30, 13 окт. 2009

Wraith
> Линейный поиск по списку в 100 миллионов нод тоже не подарок.

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

#10
10:31, 13 окт. 2009

MarkoPolo
> Честно сказать, до такого додуматься не проблема...

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

#11
12:09, 23 окт. 2009

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

#12
12:13, 23 окт. 2009

Kloun
> ИМХО тут больше всего подходит std::set

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

#13
12:18, 23 окт. 2009

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

#14
12:22, 23 окт. 2009

помойму это из области К.О. не?
я бы понял еще еслиб сдесь какиенить умные указатели разберали

Страницы: 1 2 3 Следующая »
ПрограммированиеПодсказкиОбщееОбщее

Тема в архиве.