Один за всех
От: -MyXa- Россия  
Дата: 29.09.05 15:06
Оценка:
Следующий код всем хорош:

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


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

спасибо.
Если не поможет, будем действовать током... 600 Вольт (C)
Re: Один за всех
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.09.05 15:15
Оценка: +1
Здравствуйте, -MyXa-, Вы писали:

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


Народ ленивый пошел, думать не хочет

class SomeClass
{
 private:
  static SomeOtherClass* value; //инициализируется NULL-ом
  static int sm_cnt; //инициализируется нулем

 public:
  SomeClass()
  {
   if((sm_cnt++)==0)
    value=new SomeOtherClass()
  }

 ~SomeClass()
  {
   if((--sm_cnt)==0)
   {
    delete value;
    value=NULL;
   }
  }
};//SomeClass

Про многопоточность я тоже думать не хочу
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[2]: Один за всех
От: -MyXa- Россия  
Дата: 29.09.05 15:30
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Здравствуйте, -MyXa-, Вы писали:


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


КД>Народ ленивый пошел, думать не хочет


КД>
КД>class SomeClass
КД>{
КД> private:
КД>  static SomeOtherClass* value; //инициализируется NULL-ом
КД>  static int sm_cnt; //инициализируется нулем

КД> public:
КД>  SomeClass()
КД>  {
КД>   if((sm_cnt++)==0)
КД>    value=new SomeOtherClass()
КД>  }

КД> ~SomeClass()
КД>  {
КД>   if((--sm_cnt)==0)
КД>   {
КД>    delete value;
КД>    value=NULL;
КД>   }
КД>  }
КД>};//SomeClass
КД>

КД>Про многопоточность я тоже думать не хочу

И про конструктор копии Вы тоже не хотите подумать?
Если не поможет, будем действовать током... 600 Вольт (C)
Re[3]: Один за всех
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.09.05 15:38
Оценка:
Здравствуйте, -MyXa-, Вы писали:

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


КД>>Народ ленивый пошел, думать не хочет


КД>>Про многопоточность я тоже думать не хочу


MX>И про конструктор копии Вы тоже не хотите подумать?


Ясный пфеннинг
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re[4]: Один за всех
От: Alexey_ch Швейцария  
Дата: 29.09.05 15:40
Оценка:
Здравствуйте, Коваленко Дмитрий, Вы писали:

КД>Ясный пфеннинг


private:
    SomeClass(const SomeClass& src)
    {
    }

А дальше пусть лошадь думает, у нее голова большая
... << RSDN@Home 1.1.4 beta 7 rev. 0>>
Re[3]: Один за всех
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 29.09.05 15:45
Оценка:
Здравствуйте, -MyXa-, Вы писали:

MX>И про конструктор копии Вы тоже не хотите подумать?


Я бы твой SomeClass сделал бы SomeBaseClass-ом, и запретил бы у него конструкторы-операторы копирования. value предоставлял через protected метод

А SomeClass сделал бы производным от SomeBaseClass

И было бы мне счастье.

Но это мне, темному, а другие, скорее всего воспользовались бы готовыми шаблонными решениями для такого рода задач.
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Один за всех
От: srggal Украина  
Дата: 29.09.05 15:52
Оценка:
Здравствуйте, -MyXa-, Вы писали:

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


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


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


Полсчет ссылок, ref counting вот что спасет отца русской демократии
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[3]: Один за всех
От: -MyXa- Россия  
Дата: 30.09.05 12:27
Оценка:
КД>> SomeClass()
КД>> {
КД>> if((sm_cnt++)==0)
КД>> value=new SomeOtherClass()
КД>> }

КД>> ~SomeClass()

КД>> {
КД>> if((--sm_cnt)==0)
КД>> {
КД>> delete value;
КД>> value=NULL;
КД>> }

Это хорошо, если такой указатель один в классе, а если их несколько? Мы же не можем написать:
if((sm_cnt++)==0)
{
   value1=new SomeOtherClass1();
   value2=new SomeOtherClass2();
}

по-этому придётся извращаться так:
{
   auto_ptr ptr1 ( new SomeOtherClass1() );
   auto_ptr ptr2 ( new SomeOtherClass2() );

   value1 = ptr1.release();
   value2 = ptr2.release();
}

А это уже, как мне кажется, паттерном пахнет.

А если мы захотим добавить ещё конструктор к SomeClass?

А сколько ещё страшных историй есть!
Если не поможет, будем действовать током... 600 Вольт (C)
Re[4]: Один за всех
От: Коваленко Дмитрий Россия http://www.ibprovider.com
Дата: 30.09.05 18:10
Оценка:
Здравствуйте, -MyXa-, Вы писали:

MX>Это хорошо, если такой указатель один в классе, а если их несколько? Мы же не можем написать:


MX>А это уже, как мне кажется, паттерном пахнет.

"Папа, это вы сейчас с кем разговариваете?"

MX>А если мы захотим добавить ещё конструктор к SomeClass?


MX>А сколько ещё страшных историй есть!


У этих историй один конец — надо начинать думать

Оформи SomeClass (с одним static-ом) в виде шаблона и включай его экземляры в виде подобъектов в другие объекты.
Тут есть один нюанс, но — пора начинать думать самостоятельно!
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Re: Один за всех
От: remark Россия http://www.1024cores.net/
Дата: 30.09.05 19:58
Оценка:
Здравствуйте, -MyXa-, Вы писали:

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


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


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


MX>спасибо.



Поглядев на этот первоначальный вариант и то, что предлагалось потом, возникает вопрос: а стоит ли игра свеч? Зачем это нужно? Просто интересно.
Т.е. SomeOtherClass занимает очень много памяти, а экземпляры SomeClass существуют очень не продолжительный промежуток времени.


1024cores &mdash; all about multithreading, multicore, concurrency, parallelism, lock-free algorithms
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;
Re: Один за всех
От: -MyXa- Россия  
Дата: 02.12.05 12:04
Оценка:
Принимать
typedef boost::singleton_ptr
<
    SomeOtherClass,
    boost::singleton::lifetime
    <
        boost::singleton::dependency_lifetime
    >
> SomeOtherClass_single_ptr;
три раза в день.

Если не поможет, будем действовать током... 600 Вольт (С)

Если не поможет, будем действовать током... 600 Вольт (C)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.