я создаю примерно такую штуку: Код (Text): class Cx { private: friend class CPointer<Cx>; private: int x; static CPointer<Cx> p_this; private: Cx() { x = 0; } ~Cx() { x --; } public: static Cx* get_instance() { if (p_this) return p_this; p_this.attach(new Cx); return p_this; } // ... }; CPointer<Cx> Cx::p_this; вроде, всё работает. при запросе instance вызывается конструктор, создаётся объект. при завершении функции main вызывается деструктор, объект уничтожается. не возникнет ли никаких проблем, если, например, класс Cx будет шаблонным? например Код (Text): template <class CxBase> class Cx : public CxBase { // ... }
cupuyc Вроде не должно, только определение примет такой вид: Код (Text): template< class CxBase > CPointer< Cx< CxBase > > Cx< CxBase >::p_this и находится оно должно в хедере, как и все шаблоны, в отличии от приведенного кода. Если точно - не ПРИ завершении, а ПОСЛЕ завершения (это я на всякий случай занудствую ) P.S. А че за монстр CPointer и нафик он в данном случае нужен? И в чем сакральный смысл деструктора?
from cupuyc: Ustus, про пробел я в курсе. CPointer - автоуказатель. Cx - некоторый глобальный статический класс. Я просто хочу быть уверен, что всё сработает правильно. В деструкторе большого смысла нет, можно было бы вообще объект не удалять, но при завершении программы будет неосвобождённая память в куче.
maksim_ (илиcupuyc? ) Ну, до этого-то я догадался Я в смысле это чье-то творчество, а я не знаю, или просто что-то самописное? Дело в том, что я вообще не вижу смысла в автоуказателе в данном коде, поскольку в стандартном синглтоне (а данный пример очень на него смахивает) представлением владеет только сам класс-синглтон. Ну, если очень хочется красиво, или конструктор ну очень нетривиальный, то можно обойтись std::auto_ptr. Просто я с подозрением отношусь к нестандартщине там, где без нее можно обойтись. Уж очень это дорого порой получаетсь 8-[[[ Деструктор к освобождению памяти прямого отношения не имеет, так что можно его и не объявлять. И вообще-то никакой неосвобожденной памяти не остается, приложение по завершению освобождает все полученные ресурсы, но чистить - хороший тон, да и для парадигмы RAII полезно.
это понятно. я к тому, зачем используется автоуказатель. дело в том, что стандартный std::auto_ptr использовать не могу, т.к. пишу на keil под arm и там у меня жуткие проблемы с STL (тема в electronix).
cupuyc А зачем вообще указатель использовать, тем более, если надо попроще? Пиши классическое для синглтона: Код (Text): class Cx { public: /* ... ля-ля-тополя */ static Cx* instance() { static Cx cx; return & cx; } тогда и сабжевой проблемы не будет.