Класс, который знает все свои экземпляры
Автор: Василий Густелев
Класс, который знает все свои экземпляры. Решение конечно известное, но очень поможет новичкам.
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++
Права на документ принадлежат автору, указывайте ссылку при цитировании
| Pushkoff | Участник | www | 12 окт. 2009 | 20: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 | Постоялец | www | 12 окт. 2009 | 20:45 | #5 |
|---|
if(it!=classList.end())
(*it)=0;| my.name | Постоялец | www | 13 окт. 2009 | 0:07 | #6 |
|---|
| innuendo | Постоялец | www | 13 окт. 2009 | 9:51 | #7 |
|---|
> не совсем понятно зачем объекту надо знать свои экземпляры
класс знает свои экземпляры, вместо менеджера методы класса ( хотя и не очень кузяво )
например, сделать broadcast для всех экземпляров
Последняя правка: 13 окт. 2009 9:52
| Nikopol | Модератор | www | 13 окт. 2009 | 10:27 | #8 |
|---|
> Да еще и с ошибкой.
Кстати да, спасибо.
Что-то вчера я совсем уже никакой это дело одобрял...
Исправил.
| Nikopol | Модератор | www | 13 окт. 2009 | 10:30 | #9 |
|---|
> Линейный поиск по списку в 100 миллионов нод тоже не подарок.
Ок, добавил в подсказку замечание.
| Nikopol | Модератор | www | 13 окт. 2009 | 10:31 | #10 |
|---|
> Честно сказать, до такого додуматься не проблема...
Подсказка для новичков же.
| Kloun | Участник | www | 23 окт. 2009 | 12:09 | #11 |
|---|
ИМХО тут больше всего подходит std::set
| innuendo | Постоялец | www | 23 окт. 2009 | 12:13 | #12 |
|---|
> ИМХО тут больше всего подходит std::set
отцы сказали - юзать std::set низяяя ни в коем случае, он плохо на карму действует :)
| Kloun | Участник | www | 23 окт. 2009 | 12:18 | #13 |
|---|
> отцы сказали - юзать std::set низяяя ни в коем случае, он плохо на карму
> действует :)
серьезно? а я тыкаю где не поподя ;( теперь гореть мне в аду???
| cNoNim | Участник | www | 23 окт. 2009 | 12:22 | #14 |
|---|
я бы понял еще еслиб сдесь какиенить умные указатели разберали
/ Форум / Программирование игр / Общее
Для определения, можете ли вы оставлять сообщения, необходимо войти в систему под своим логином.