Можно ли в кострукторе класса проверить некое условие и сразу запустить деструктор, если условие не удовлетворяет?

231
06 апреля 2017, 20:36

Можно ли в конструкторе класса проверить некое условие и сразу запустить деструктор, если условие не удовлетворяется?
Или же придется бросать исключение?

Answer 1

И что вы хотите получить? Отсутствие объекта? Но если объект начал создаваться - то на выходе должен либо быть корректный объект, либо исключение.

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

Вы в принципе можете вызвать деструктор

class String
{
public:
    String(const char * s);
    ~String();
private:
    char * s;
};
String::String(const char * x)
{
    s = new char[strlen(x)+1];
    strcpy(s,x);
    if (1 /*в строке - маты :)*/)
    {
        this->~String();
        s = nullptr;
    }
}
String::~String()
{
    delete[] s;
}

int main(int argc, const char * argv[])
{
    String s("hello");
}

Только объект-то все равно будет создан. Как и при динамическом создании - вызвав new, вы уже выделяете память. Если конструктор не сгенерирует исключение - что окажется в этой памяти?

READ ALSO
Вопрос по очереди

Вопрос по очереди

Нужно разделить очередь на две, в одну значения большие или равные среднему,во вторую меньшие,при этом не создавая новую(задание такое)Как...

223
Оптимальная настройка image-min в Gulp

Оптимальная настройка image-min в Gulp

Подскажите какие должны быть настройки у image-min и его плагинов через Gulp, чтобы уровень сжатия картинок (png, jpg) был приближен к сжатию в Tinypng ?

524
TypeError при попытку вызвать spread в bluebird

TypeError при попытку вызвать spread в bluebird

При попытке запустить такой код

217