Как бы так это заделать???
Во первых, статья очень хорошая и полезная, спасибо. Применил в реальной программе я этот сингелтон и остался очень доволен. Но мне надо было несколько изменить поведение исходного класса. У меня ситуация такая: есть клиент, который шлёт запросы на сервер, на сервере есть класс, который создаёт и хранит необходимые для обработки этих запросов таблицы. Но беда в том, что после обработки очередного запроса мне не надо уничтожать объект, т.к. эти запросы идут сериями по многу штук подряд, а удалять объект надо в конце серии... Я сделал во что:
>template
>T* Singleton::Instance()
>{
> if(!_self)
> {
> _self=new T;
> _refcount++; // вот это
> }
> _refcount++;
> return _self;
>}
Но выглядит на мой взгляд коряво. Может есть какие-то паттерны на этот случай?
Ну, в довесок хочу воткнуть так вот полу-смарт указатель:
>template
>class TSingeltonPtr
>{
> T *_t;
>public:
> TSingeltonPtr() { _t = T::Instance(); }
> ~TSingeltonPtr() { if(_t) _t->FreeInst(); }
> operator T*() { return _t; }
> T* operator->() { return _t; }
> bool operator!() const { return _t==0; }
>};
использование:
>class Derived : public Singleton
>{
>void foo();
>...
>};
>void bar()
>{
> TSingeltonPtr sp;
> if ( !sp ) return;
> sp->foo();
>}
konst 11.12.2002 19:17
Маленькое замечание
Все таки непонятно, откуда пошла дурацкая мода в с++ коде давать данным-членам класса символ подчеркивания в качестве префикса? То есть, и так ясно откуда...
Но ведь c++ не java... Например на MCVC++ код с такими префиксами не компилируется иногда. Ведь сказано же, зарезервировано под надобности компиляторов. Или это специально так отформатировано, чтобы читать было красивее? ;)
А статья действительно хорошая, удивило то что почти не пересекается с [3] ;)
Пересыпкин Михаил Алексеевич 3.12.2002 16:39