можно ли получить указатель на конструктор класса?
От:
collider
Дата: 10.06.10 08:09
Оценка:
Сабж. + можно ли как то выяснить есть ли у типа дефолтный конструтор?
Re: можно ли получить указатель на конструктор класса?
От:
Bell
Дата: 10.06.10 08:24
Оценка:
Здравствуйте, collider, Вы писали:
C>Сабж. + можно ли как то выяснить есть ли у типа дефолтный конструтор?
Указатель получить нельзя.
Любите книгу — источник знаний (с) М.Горький
Re: можно ли получить указатель на конструктор класса?
Здравствуйте, collider, Вы писали:
C>Сабж. + можно ли как то выяснить есть ли у типа дефолтный конструтор?
Буст:
проверка /
биндинг к конструктору
А зачем, кстати, понадобился "указатель на конструктор"?
Может быть, пойдёт вот такая простенькая обёртка
template <class T> T* create() { return new T(); }
template <class T0, class T> T0* createDerived() { return new T(); }
.....
typedef Base* (*PFN_BaseCreator)();
PFN_BaseCreator creators[3] = { createDerived<Base,Foo>, createDerived<Base,Bar>, createDerived<Base,Buz> };
.....
Base* p = creators[1]();
assert(dynamic_cast <Bar*>(p));
Перекуём баги на фичи!
Re: можно ли получить указатель на конструктор класса?
Здравствуйте, collider, Вы писали:
Именно на конструктор произвольного объекта можно только жутким хаком где в каждой строке UB, хотя получить указатель на другой метод вызывающий конструктор можно используя placement new.
Re[2]: можно ли получить указатель на конструктор класса?
От:
dilmah
Дата: 10.06.10 16:23
Оценка:
_>хотя получить указатель на другой метод вызывающий конструктор можно используя placement new.
И, на какой метод? В голову приходит только operator new(size_t, void*) но он не вызывает конструктор.
Re[3]: можно ли получить указатель на конструктор класса?
offtop:
D>В голову приходит только operator new(size_t, void*) но он не вызывает конструктор.
это placement new, он вызывает конструктор.
Re[4]: можно ли получить указатель на конструктор класса?
От:
dilmah
Дата: 10.06.10 20:03
Оценка:
D>>В голову приходит только operator new(size_t, void*) но он не вызывает конструктор.
G_>это placement new, он вызывает конструктор.
operator new(size_t, void*) не вызывает конструктор
placement new это конструкция языка, на нее нет указателя.
Re[5]: можно ли получить указатель на конструктор класса?
От:
Кодёнок
Дата: 11.06.10 06:16
Оценка:
Здравствуйте, dilmah, Вы писали:
D>placement new это конструкция языка, на нее нет указателя.
Но можно звать new из вспомогательной функции, и взять указатель на нее
Re[5]: можно ли получить указатель на конструктор класса?
D>operator new(size_t, void*) не вызывает конструктор
Да??
D>placement new это конструкция языка, на нее нет указателя.
я для кого написал "offtop"?
Re[6]: можно ли получить указатель на конструктор класса?
От:
dilmah
Дата: 11.06.10 10:20
Оценка:
D>>operator new(size_t, void*) не вызывает конструктор
G_>Да??
вообще-то это общеизвестный факт. Дефолтный operator new(size_t, void*) выглядит так:
void* operator new(size_t, void* p) { return p; }
Re[6]: можно ли получить указатель на конструктор класса?
От:
Кодт
Дата: 11.06.10 10:21
Оценка:
Здравствуйте, Guard_h4s, Вы писали:
D>>operator new(size_t, void*) не вызывает конструктор
G_>Да??
Представьте себе!
Оператор только выделяет память, в соответствии с указанными параметрами. А конструирование лежит уже на плечах
выражения new.
Buz* p = new (foo,bar) Buz(a,b,c,d);
// эквивалентно
void * mem = Buz:: operator new (sizeof (Buz),foo,bar); // выделяем память... может вылететь исключение!
// ~~~~~ ищем подходящий оператор сперва в контексте класса, затем глобальный
if (mem)
{
try
{
((Buz*)mem)->__ctor (a,b,c,d); // вызываем конструктор... может вылететь исключение!
// кстати, VC
}
catch (...)
{
Buz:: operator delete (mem,foo,bar); // если не получилось, освобождаем память
// оператор, парный к оператору выделения
throw ;
}
}
p = (Buz*)mem; // если не было исключений, возвращаем указатель (возможно, нулевой!)
Наиболее известные выражения new — это
// выражение оператор new оператор delete
new T(...) void * T:: operator new (size_t) void T:: operator delete (void *)
new (std::nothrow) T(...) void * operator new (size_t,std::nothrow_t) void operator delete (void *,std::nothrow_t)
new (buffer) T(...) void * operator new (size_t,void *) void operator delete (void *,void *)
Перекуём баги на фичи!
Re[7]: можно ли получить указатель на конструктор класса?
Здравствуйте, Кодт, Вы писали:
К>Представьте себе!
Хорошо, уговорили!
Re[7]: можно ли получить указатель на конструктор класса?
Здравствуйте, dilmah, Вы писали:
D>вообще-то это общеизвестный факт.
я просто перепутал оператор с выражением.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить