вопрос по статическим членам класса

Тема в разделе "LANGS.C", создана пользователем cupuyc, 4 май 2010.

  1. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    я создаю примерно такую штуку:
    Код (Text):
    1. class Cx
    2. {
    3. private:
    4.   friend class CPointer<Cx>;
    5.  
    6. private:
    7.   int x;
    8.   static CPointer<Cx> p_this;
    9.  
    10. private:
    11.   Cx()
    12.   {
    13.     x = 0;
    14.   }
    15.  
    16.   ~Cx()
    17.   {
    18.     x --;
    19.   }
    20.  
    21. public:
    22.   static Cx* get_instance()
    23.   {
    24.     if (p_this)
    25.       return p_this;
    26.  
    27.     p_this.attach(new Cx);
    28.     return p_this;
    29.   }
    30.  
    31.   // ...
    32. };
    33.  
    34. CPointer<Cx> Cx::p_this;
    вроде, всё работает. при запросе instance вызывается конструктор, создаётся объект. при завершении функции main вызывается деструктор, объект уничтожается. не возникнет ли никаких проблем, если, например, класс Cx будет шаблонным? например

    Код (Text):
    1. template <class CxBase>
    2. class Cx :
    3.   public CxBase
    4. {
    5. // ...
    6. }
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    cupuyc
    Вроде не должно, только определение примет такой вид:
    Код (Text):
    1. template< class CxBase >
    2. CPointer< Cx< CxBase > > Cx< CxBase >::p_this
    и находится оно должно в хедере, как и все шаблоны, в отличии от приведенного кода.
    Если точно - не ПРИ завершении, а ПОСЛЕ завершения (это я на всякий случай занудствую:) )

    P.S. А че за монстр CPointer и нафик он в данном случае нужен? И в чем сакральный смысл деструктора?
     
  3. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Главное - в CPointer<Cx<CxBase> > не забыть пробел между > >
    :):):)
     
  4. maksim_

    maksim_ New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2009
    Сообщения:
    263
    from cupuyc:
    Ustus, про пробел я в курсе. CPointer - автоуказатель. Cx - некоторый глобальный статический класс. Я просто хочу быть уверен, что всё сработает правильно. В деструкторе большого смысла нет, можно было бы вообще объект не удалять, но при завершении программы будет неосвобождённая память в куче.
     
  5. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    maksim_ (илиcupuyc? :) )
    Ну, до этого-то я догадался :) Я в смысле это чье-то творчество, а я не знаю, или просто что-то самописное? Дело в том, что я вообще не вижу смысла в автоуказателе в данном коде, поскольку в стандартном синглтоне (а данный пример очень на него смахивает) представлением владеет только сам класс-синглтон. Ну, если очень хочется красиво, или конструктор ну очень нетривиальный, то можно обойтись std::auto_ptr. Просто я с подозрением отношусь к нестандартщине там, где без нее можно обойтись. :) Уж очень это дорого порой получаетсь 8-[[[
    Деструктор к освобождению памяти прямого отношения не имеет, так что можно его и не объявлять.
    И вообще-то никакой неосвобожденной памяти не остается, приложение по завершению освобождает все полученные ресурсы, но чистить - хороший тон, да и для парадигмы RAII полезно.
     
  6. cupuyc

    cupuyc New Member

    Публикаций:
    0
    Регистрация:
    2 апр 2009
    Сообщения:
    763
    это понятно. я к тому, зачем используется автоуказатель. дело в том, что стандартный std::auto_ptr использовать не могу, т.к. пишу на keil под arm и там у меня жуткие проблемы с STL (тема в electronix).
     
  7. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    cupuyc
    А зачем вообще указатель использовать, тем более, если надо попроще?
    Пиши классическое для синглтона:
    Код (Text):
    1. class Cx
    2. {
    3. public:
    4.     /*
    5.     ... ля-ля-тополя
    6.     */
    7.     static Cx* instance()
    8.     {
    9.         static Cx cx;
    10.         return & cx;
    11.     }
    тогда и сабжевой проблемы не будет.