LINUX.ORG.RU

Вызов деструктора в конструкторе

 


0

1

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

MyClass myObject = MyClass(someParam);
// Тут объект уже должен быть мертвым, выполнив свои действия


Ответ на: комментарий от cdshines

Эээ.. Сделать статическим деструктор или все остальные методы? Просто в конструкторе вызывается ряд методов, которые готовят данные. На любом из этапов может быть вызван exit(0) (ну или исключение, сейчас кидается фуллстоп для простоты). Если все «подготовительные этапы» прошли успешно, выполняется действие и объект должен самоуничтожиться.

inn
() автор топика
void Foo()
{
  {
    MyClass myObject = MyClass(someParam);
  }
  // some code
}
Amp ★★★
()
Ответ на: комментарий от inn

Если время жизни экземпляра не превышает время жизни его конструктора, задумайся над персмотром архитектуры. Если суть методов объекта сводится к выполнению какой-то работы один раз при конструировании, сделай их статическими и вызывай из конструктора (хотя это, опять жеЮ ниочинь подход, но я видел такие случаи - клас - просто обертка для набора функций). Тебе же объект не нужен по сути.

cdshines ★★★★★
()
Последнее исправление: cdshines (всего исправлений: 1)
Ответ на: комментарий от anonymous

В комплекте идут хэш-данные, списки и рекурсивное создание таких же объектов внутри него. Так что просто функцией тут не обойтись.

inn
() автор топика
Ответ на: комментарий от inn

Если нужен доступ к внутренностям этого класса, то эту функцию можно зафрендить с этим классом.

anonymous
()
Ответ на: комментарий от cdshines

Хорошо. О пересмотре архитертуры. Вот сейчас оно примерно так:

// xxx.h
#include ...

class Xxx : public QObject
{
  Q_OBJECT

public:
  Xxx(QString FileName);

private:
  Xxx * child;

  void func1(QString FileName);
  void func2 ...
  ...
  ... func5;

  ... run ...
  ... recursiveLoad(QString FileName);
}
// xxx.h
#include ...

Xxx::Xxx(QString FileName)
{
   Func1(...); // May be killed here
   Func2 ...   // Or here
   ...         // Or even here
   Func5       // But the most probably here
   run(void);
}

Xxx::run(void)
{
  // cycle for commands
  // and if we've find the command we didn't load yet - load it:
  child = new Xxx("Path/To/Command/File/And/Its/File/Name.xxx");
  // May be recursive for more than N levels.
}
inn
() автор топика
Ответ на: комментарий от anonymous

То, что для его работы потребуется

private:
    QList<Command>  * commands;
А для каждого экземпляра объекта они свои. поэтому сделать глобальными - не айс.

inn
() автор топика
Ответ на: комментарий от anonymous

1) Стек не лопнет, если я её рекурсивно overдофига раз вызову?
2) В C++ НЕТ вложенных функций (это костыль), поэтому одиночную функцию придется сопровождать еще добрым десятком того, что сейчас в private.

inn
() автор топика
Ответ на: комментарий от inn

Стек не лопнет, потому что данные все равно будут в куче. Функции положи в файл реализации и сделай их static.

anonymous
()
Ответ на: комментарий от anonymous

А суровые бородатые дяди в свитерах не будут тыкать меня вилами с надписью ООП за такую реализацию?

inn
() автор топика
Ответ на: комментарий от inn

Нет. :)

Но если кто-то откроет рот, то сразу засунь их в какой нибудь namespace. :)

anonymous
()
Ответ на: комментарий от inn

Сделать статическим деструктор

обьясните мне плз что здесь имеется в виду?

nokachi
()
Ответ на: комментарий от inn

Никогда не выполняй тяжёлых вычислений, не относящихся к созданию объекта, в его конструкторе. _Никогда_.

Amp предложил самый удобный вариант. Если нужно в нескольких местах вызывать, сделать статическую функцию:

class Xxx {
   Xxx();
   void func1();
   void func2();
   void func3();
   ...
   static void compute()
   {
       Xxx xxx;
       xxx.func1();
       xxx.func2();
       xxx.func3();
       xxx.run();
   }
};

И вызывай: Xxx::compute();

schizoid ★★★
()
Ответ на: комментарий от Begemoth

Да, действительно, сейчас проверил - не оптимизируется.

Попутал с фактом, что такой объект тут же уничтожается, ибо не используется.

schizoid ★★★
()
Ответ на: комментарий от schizoid

В таком виде он ругается на undefined reference to 'Xxx::compute()'. Вызов из другого модуля, хидер подключен.

inn
() автор топика

куда катится этот мир ...

печитай ООП для С++ юный падаван.

PS я кстати натаскиваю падаванов Qt4 С++, если есть желание то черкни письмецо, адрес есть в профиле.

MikeDM ★★★★★
()
Ответ на: комментарий от inn

Пардон, не заметил. Тогда добавь в .pro.

Пересобери проект для уверенности.

schizoid ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.