Re: Один за всех
От: Serpent_T.B.  
Дата: 02.10.05 18:32
Оценка:
Здравствуйте, -MyXa-, Вы писали:

MX>Следующий код всем хорош:

MX>

MX>class SomeClass
MX>{
MX>   static SomeOtherClass value;
MX>public:
MX>   ...
MX>};
MX>


MX>Вот только объект value болтается в памяти до самого завершения приложения, а хотелось бы, чтоб он уничтожался как только нет ни одного из SomeClass. Создаваться единственный SomeOtherClass должен, как только есть хотя бы один SomeClass. Есть тому стандартное решение или CRTP и указатель мне в руки?
...


И:

MX>Это хорошо, если такой указатель один в классе, а если их несколько?



Так ведь можно проверять ещё на нулл кроме рефкаунтинга...

class SomeClass
{
private:
  static SomeOtherClass* value1;
  ...
  static SomeOtherClass* valueN;
  static int sm_cnt; //инициализируется нулем


 public:
  SomeClass()
  {
    if((sm_cnt++)==0)
    {
        if (value1 == NULL)
          value1 = new SomeOtherClass();
        ...
        if (valueN == NULL)
          valueN = new SomeOtherClass();
    }
  }

 ~SomeClass()
  {
    if((--sm_cnt)==0)
    {
      if (value1)
      {
        delete value1;
        value1 = NULL;
      }
      ...
      if (valueN)
      {
        delete valueN;
        valueN = NULL;
      }
   }
  }
};//SomeClass

SomeClass::SomeOtherClass* value1 = NULL;
...
SomeClass::SomeOtherClass* valueN = NULL;
int SomeClass::sm_cnt = 0;
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.