Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2015, 11:12   #1
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию Удалить объект в конструкторе

Здравствуйте господа Гуру С++

Имеется некий класс А в конструкторе которого прописано создание объектов других классов (несколько штук разных).
Если один из объектов не создаётся по какой то причине, нужно убить и сам объект контейнер.
Вопрос, как это синтаксически и логически правильно прописать в С++

наглядно

Код:
 class TDrawCircle 
  {
     private:
     public:
     и.т.п
   }

  class TDrawBox
  {
     private:
     public:
     и.т.п
   }

  class TDrawLine
  {
     private:
     public:
     и.т.п
   }




  class TIntellectDrawer
  {
     private:
        TDrawCircle * Circle;
        TDrawBox * Box;
        TDrawLine * Line;
     public:

     // конструктор
     TIntellectDrawer 
     {
        try
          Circle = new TDrawCircle;
        catch ()
        {
          Circle = 0;
        }

        try
          Box = new TDrawBox ;
        catch ()
        {
          Box  = 0;
        }
        try
          Line = new TDrawLine ;
        catch ()
        {
          Line  = 0;
        }
         
        if (Line == 0 || Box == 0 || Circle == 0)
        { 
          послать лесом юзера (это я знаю как делать)
          завалить текущий объект
          делаю так:
          delete this;
        }  

     }   

     ~TIntellectDrawer(void) 
     {
     }   


   }
но после delete this объект далее живёт своей жизнью и в нём что-то происходит, например инициализируется один из вложеных объектов
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 01.08.2015, 11:22   #2
Rififi
Старожил
 
Регистрация: 19.08.2009
Сообщений: 2,119
По умолчанию

Имеется некий класс А в конструкторе которого прописано создание объектов других классов (несколько штук разных).
Если один из объектов не создаётся по какой то причине, нужно убить и сам объект контейнер.
Вопрос, как это синтаксически и логически правильно прописать в С++


Код:
class TIntellectDrawer
  {
     private:
        std::unique_ptr<TDrawCircle> Circle;
        std::unique_ptr<TDrawBox> Box;
        std::unique_ptr<TDrawLine> Line;
     public:

     // конструктор
     TIntellectDrawer() : Circle(new TDrawCircle()), Box(new TDrawBox()), Line(new TDrawLine())
     { }
Rififi вне форума Ответить с цитированием
Старый 01.08.2015, 11:25   #3
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

А где код самоубийца?

Мне нужно в конструкторе сделать самоубийство в случае, если какой то из объектов не создался
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 01.08.2015, 18:08   #4
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

try ... catch тобишь исключения.... и так все конструкторы.
А ещё есть какие то другие исключения... которые перетекли с делфи
Exception например.
офф сайт
ЗЫ:
А валить объект не нужно он должен при создании вернуть NULL так покрайне мере в чистом с++...
Rififi показал способ, который кстати описан в офф сайте выше ссылка
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 01.08.2015 в 18:22.
Perchik71 вне форума Ответить с цитированием
Старый 01.08.2015, 22:57   #5
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Perchik71 Посмотреть сообщение
валить объект не нужно он должен при создании вернуть NULL так покрайне мере в чистом с++

А как это делается?
waleri вне форума Ответить с цитированием
Старый 01.08.2015, 23:52   #6
Perchik71
С++, Delphi
Форумчанин
 
Аватар для Perchik71
 
Регистрация: 24.11.2012
Сообщений: 495
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение

А как это делается?
Переопределением new
ЗЫ: не глобального, а для класса, хз работает ли это в Builder, особенно в 6.

На игровом форуме, такая тема поднималась, пришли к вот такому вообще выводу Пост.
Код:
class T
{
 ...
 void Destroy ();
 ...
public:
 ~T () { Destroy (); }

 T ()
 {
  try {
  ... // птичкоопасный код
  }
  catch (...)
  { Destroy (); throw; }
 }
};
Если помог, тут весы есть , Вам не сложно, а мне приятно.

Последний раз редактировалось Perchik71; 02.08.2015 в 00:04.
Perchik71 вне форума Ответить с цитированием
Старый 02.08.2015, 00:08   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Для того, чтоб это сработало надо такой огород нагородить, что это трудно будет назвать чистым С++. Уж тогда лучше стандартным способом - выбросив exception.
waleri вне форума Ответить с цитированием
Старый 02.08.2015, 00:43   #8
ResourceSpace
Форумчанин
 
Аватар для ResourceSpace
 
Регистрация: 30.06.2015
Сообщений: 353
По умолчанию

Зачем убивать сам объект при создании? А как код создающий объект узнает что тот самоубился? Не уверен что это логически верно да и вообще возможно.
Если что-то пошло не так - останавливаемся и выкидываем исключение.
Код который вызывает создание объекта должен ловить исключение, и тогда вызывать деструктор. Не?
ResourceSpace вне форума Ответить с цитированием
Старый 02.08.2015, 09:28   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

И того проще - только ловить исключение и присваивать NULL;
Хотя, по сути, и это будет лишним - ведь потом кто-то будет проверять этот NULL, а раз он присваевается в catch блоке, то прямо там можно вставить обработчик ошибок. Вся прелесть в том, что catch блок может быть один на много операций.
waleri вне форума Ответить с цитированием
Старый 02.08.2015, 09:55   #10
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Господа, перепробовал Ваши методи и что самое главное - спасибо Вам огромное они прокатили НО осталась ещё одна хрень. Каскадное оповещение о самоубийстве вложенного объекта.
Поясняю подробно. У меня происходит приблизительно следующее

Код:
class TDrawCircle 
{
  private:
  public:
  и.т.п
}

class TIntellectDrawer
{
  private:
     TDrawCircle * Circle;
  public:

  // конструктор
  TIntellectDrawer 
  {
    try
      Circle = new TDrawCircle;
    catch ()
   <<<<<  ================ ПУСТЬ ВАЛИТСЯ ТУТ ========================>>
    {
      Circle = 0;
      delete this; // вызываю деструктор
    }
  }   
}


class THemieContainer
{
  private:
     TIntellectDrawer * Drawer;
  public:

  // конструктор
  THemieContainer
  {
    try
      Drawer = new TIntellectDrawer;
    catch ()
    {
      Drawer = 0;
      delete this; // вызываю деструктор
    }
  }   
}



class TForm1
{
  private:
     THemieContainer * HEMIE;
  public:

  // конструктор
  TForm1
  {
    try
      HEMIE = new THemieContainer;
    catch ()
    {
      HEMIE = 0;
      delete this; // вызываю деструктор
    }
  }   
}
Пусть "упал" TDrawCircle в конструкторе. Как заставить упасть THemieContainer и в последствии TForm1 если даже после delete this результат не нулевой
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 02.08.2015 в 10:14.
JUDAS вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как удалить объект из реестра. foxes Общие вопросы Delphi 7 05.12.2013 13:31
как удалить в списке объект по ссылке the_deer_one C# (си шарп) 4 25.04.2012 06:34
как удалить объект во время выполнения программы на AS 2.0 ALKOrobot JavaScript, Ajax 0 11.07.2011 01:09
как удалить объект по указателю на его базовый класс? AndreyBS Общие вопросы C/C++ 5 17.04.2011 11:29
Объект одного класса в конструкторе другого Benderbej PHP 5 13.02.2011 22:48