Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> class constructor, запуск конструктора 
:(
    Опции темы
Jcs
Дата 21.11.2003, 15:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



Может кто знает, как запустить констуктор вручную? Смысл - использование своего менеджера памяти. Спасибо.
PM   Вверх
setq
Дата 21.11.2003, 15:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











создай экземпляр своего менеджера памяти - конструктор и запустится.
  Вверх
Vyacheslav
Дата 21.11.2003, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



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

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




--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
Jcs
Дата 22.11.2003, 06:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 156
Регистрация: 1.10.2003

Репутация: нет
Всего: нет



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

void* MyClass::operator new(size_t size)

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

PM   Вверх
Vyacheslav
Дата 24.11.2003, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 2124
Регистрация: 25.3.2002
Где: Москва

Репутация: 9
Всего: 59



Во первых, почему ты так уверен, что конструктор не вызывается при перегузке оператора для класса. Оператор 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;



--------------------
С уважением, Вячеслав Ермолаев
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0742 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.