Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > class constructor


Автор: Jcs 21.11.2003, 15:02
Может кто знает, как запустить констуктор вручную? Смысл - использование своего менеджера памяти. Спасибо.

Автор: setq 21.11.2003, 15:36
создай экземпляр своего менеджера памяти - конструктор и запустится.

Автор: Vyacheslav 21.11.2003, 15:50
Использование своего менеджера памяти возможно через перегузку опeратора new. Еще также можно воспользоваться оператором размещения
void *operator new(std::size_t size, void *ptr);
Код

class MyClass;
//выделяем память
char* ptr = new char[sizeof(MyClass)];
//размещаем в выделенной памяти объект
MyClass* cls = new(ptr) MyClass;


Автор: Jcs 22.11.2003, 06:51
Перегрузить, насколько я знаю можно operator new внутри класса, т.е.

void* MyClass::operator new(size_t size)

но в этом случае MyClass::MyClass() не вызывается, то же саме и с деструкторами - при использовании глобального delete все нормально, все вызывается, но когда переопределяешь кроме перегруженного оператора. Можно,конечно все функции конструктора возложить на перегруженный operator new, но это не есть выход.

Автор: Vyacheslav 24.11.2003, 12:19
Во первых, почему ты так уверен, что конструктор не вызывается при перегузке оператора для класса. Оператор new только выделяет память, все остальное выполняет все равно конструктор
Код

struct A
{
    A(){cout<<"A::A";  };
    void FuncA(string s){ShowMessage(s.c_str());};
    void *operator new(std::size_t size)
    {
     void* ptr = new char[size];
     return ptr;
    }
};

A*  pa = new A;

Здесь вызовется переопределенный оператор new и конструктор.

Во-вторых, никто не мешает перегрузить и просто new в своем пространстве имен. Например так
Код

namespace MySpace
{

void *operator new(std::size_t size)
{
       void* ptr = new char[size];
       return ptr;
}

struct A
{
    A(){cout<<"A::A";};
    void FuncA(string s){ShowMessage(s.c_str());};
};

struct B
{
  B(){cout<<"B::B";};
  void FuncB(string s){ShowMessage(s.c_str());};
};
}

MySpace::A* pa = MySpace::new MySpace::A;
MySpace::B* ba = MySpace::new MySpace::B;



Ну и последнее и самое простое : вариант оператора с размещением ты почему-то совсем не рассмотрел. Cначала выделяешь память как тебе надо, а затем размещаешь по адресу объект. Еще раз
Код


class MyClass;
//выделяем память там где нам надо, используя свой собственный аллокатор памяти
char* ptr = MyAllocMem(sizeof(MyClass));
//а теперь размещаем в выделенной памяти объект
MyClass* cls = new(ptr) MyClass;

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)