Запретить создание автоматических переменных - как?
От: Igor Romanov СССР  
Дата: 27.10.04 09:14
Оценка:
Вопрос:

Как сконструировать класс так, что его инстансы можно будет создать только динамически (через new)?
--
Igor
Re: Запретить создание автоматических переменных - как?
От: Glоbus Украина  
Дата: 27.10.04 09:21
Оценка:
Здравствуйте, Igor Romanov, Вы писали:

IR>Вопрос:


IR>Как сконструировать класс так, что его инстансы можно будет создать только динамически (через new)?


Может в таком вот виде:

class CNoAuto
{
public:
  static CNoAuto* Make(int _param1, int _param2 )
  {
    return new CNoAuto( _param1, _param2 );
  }

  static CNoAuto* Make( const CNoAuto* _ptr )
  {
    retur new CNoAuto( *_ptr );
  }

  virtual ~CNoAuto() {}


private:
  CNoAuto(int _param1, int _param2 )
  {
    ///тут действия по инициализации

  }

  CNoAuto( const CNoAuto& )
  {
    ///тут действия по инициализации
  }
};
Удачи тебе, браток!
Re: Запретить создание автоматических переменных - как?
От: Bell Россия  
Дата: 27.10.04 09:25
Оценка: 3 (1)
Здравствуйте, Igor Romanov, Вы писали:

IR>Вопрос:


IR>Как сконструировать класс так, что его инстансы можно будет создать только динамически (через new)?

Сделать деструктор приватным, а в самом классе сделать статические функции создания/удаления:

class A
{
   ~A() {}
public:
   static A* create() { return new A(); }
   static void destroy(A* p) { delete p; }
};

int main()
{
 A* pa = A::create();
 A::destroy(pa);
 return 0;
}
Любите книгу — источник знаний (с) М.Горький
Re: Запретить создание автоматических переменных - как?
От: s_anatoli Украина http://koresha.org/sakhnik
Дата: 27.10.04 09:27
Оценка:
Здравствуйте, Igor Romanov, Вы писали:

IR>Как сконструировать класс так, что его инстансы можно будет создать только динамически (через new)?


Слышал, нужно защитить конструкторы, определить оператор new. Можно посмотреть в АТЛ.

Жизнь — это чудо! Только вперёд: sakhnik@jabber.kiev.ua
Re[2]: Запретить создание автоматических переменных - как?
От: MaximE Великобритания  
Дата: 27.10.04 09:41
Оценка: 3 (1)
On Wed, 27 Oct 2004 09:25:59 GMT, Bell <3057@news.rsdn.ru> wrote:

> IR>Вопрос:

>
> IR>Как сконструировать класс так, что его инстансы можно будет создать только динамически (через new)?
> Сделать деструктор приватным, а в самом классе сделать статические функции создания/удаления:

Достаточно сделать д-тор непубличным. Ф-цию удаления, для удобства, можно сделать нестатической.

struct some
{
     void destroy() const { delete this; }
protected:
     ~some() {}
};

//...

some* s = new some;
s->destroy();


Вообще, если такое желание возникает, скорее всего, правильным решением будет вообще скрыть от пользователя реализацию и предоставить лишь интерфейс и виртуальный конструктор. Это делает дизайн более ясным:

struct some
{
     virtual void do_some() = 0;
     virtual ~some() {}
};

// std::auto_ptr<> здесь говорит нам о том, что мы передаем пользователю объект
// в монопольное владение (strict ownership), и он ответственен за его удаление
std::auto_ptr<some> some_ctor();


--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.