вызов конструктора объекта вручную - PullRequest
4 голосов
/ 17 мая 2011

Подскажите, пожалуйста, можно ли вызвать конструктор объекта вручную ?Я знаю, что это неправильно, и я бы никогда не сделал что-то подобное в своем собственном коде, и я знаю, что могу решить эту проблему, создав и вызвав функцию инициализации, однако проблема в том, что я наткнулся на случай, когда в коде тысячи строкконструкторы объекта и его родителей ...

class MyClass()
{
    MyClass() { }
    virtual ~MyClass();

    void reset()
    {
         this->~MyClass();
         this->MyClass::MyClass(); //error: Invalid use of MyClass
    }
};

Ответы [ 3 ]

5 голосов
/ 17 мая 2011

Вы все еще можете перемещать конструкцию / разрушение в отдельные функции и вызывать их напрямую.т.е.

class MyClass {
public:
    MyClass() { construct(); }
    ~MyClass() { destruct(); }

    void reset() {
        destruct();
        construct();
    }

private:
    void construct() {
        // lots of code
    }

    void destruct() {
        // lots of code
    }
};
3 голосов
/ 17 мая 2011

Вы можете использовать новый синтаксис размещения:

this->~MyClass(); // destroy
new(this) CMyClass(); // construct at the same address
2 голосов
/ 17 мая 2011

Конструктор вызывается с помощью размещения new

new (address) MyClass();

Это создает MyClass в пустом месте по адресу.

Никогда бы этого не сделал внутри класса, хотя!

Редактировать
Если у вас уже есть объект правильного типа и вы хотите присвоить ему значения по умолчанию, альтернативой является

*this = MyClass();

, который создаетновый объект со значениями по умолчанию и назначает это значение существующему объекту.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...