Как запретить создавать объект на стеке?
От: _Winnie Россия C++.freerun
Дата: 19.10.05 10:56
Оценка: :)
Обычно отвечают "сделай private конструктор и порождающую функцию". Но это pain и bore писать для каждого класса такую функцию. А написать обобщенную невозможно. Но всё гораздо проще. Не нужно обобщенной Create. Сделаем обобщённый Destroy. Всё равно нужно что-то писать, но уже гораздо меньше.

Ответ:

//maybe, boost::checked_delete ?
template <class T>
void kill(T *p) 
{
    (void)sizeof(T);
    delete p;
}




class X
{
private:
    virtual ~X() {}
    friend void kill<X>(X *x);
};

int main()
{
    {
        X *p = new X;
        kill(p); //OK.
    }

    {
        X x; 
        //error: `virtual X::~X()' is private
    }  
}
Правильно работающая программа — просто частный случай Undefined Behavior
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.