условное создание объектов класса

 

Имеется класс с параметрическим конструктором. Далее в коде создается новый объект класса оператором new.

Как в конструкторе, по результату проверки входных параметров, прервать инициализацию и не создавать новый объект класса?

 
Никак. Фабрика с предварительной проверкой параметров.
 
Andrei Trukhanovich:
Никак. Фабрика с предварительной проверкой параметров.

попробовал

delete GetPointer(this);

вроде работает.

 
Alexandr Atagyan:

попробовал

вроде работает.

Как-то стрёмно такое делать в конструкторе.

А оператор new вернёт NULL?

 
PapaYozh:

Как-то стрёмно такое делать в конструкторе.

А оператор new вернёт NULL?

Нет, не вернет.

Зло злое подобное деяние. Поведение конструктора должно быть ожидаемым - возврат валидного указателя (дескриптора в нашем случае). Любое не тривиальное поведение = баг (поверьте, даже сами не уследите). Фабрика - решает.

 
class MyClass
  {
public:
                     MyClass(bool del=false){if(del) delete GetPointer(this);};
                    ~MyClass(void){};
  };

MyClass  *test1,*test2,*test3;


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   
   test1=new MyClass;
   test2=new MyClass(true);
   test3=new MyClass;
   
   Print("1 ",test1);
   Print("2 ",test2);
   Print("3 ",test3);
   
   
   delete test1;
   delete test3;
  }

и результат:

2021.03.25 16:23:12.396 Script 2 EURUSD,M30: removed
2021.03.25 16:23:12.394 2 EURUSD,M30: uninit reason 0
2021.03.25 16:23:12.394 2 EURUSD,M30: 3 2
2021.03.25 16:23:12.394 2 EURUSD,M30: 2 2
2021.03.25 16:23:12.394 2 EURUSD,M30: 1 1
2021.03.25 16:23:12.394 2 EURUSD,M30: initialized
2021.03.25 16:23:12.381 Script Test\2 EURUSD,M30: loaded successfully

оператор new не вернет NULL, но при создании следующего объекта, предыдущий (удаленный в конструкторе) указатель учтен не будет, соответсвенно и удаление такого объекта не требуется.

 
Alexandr Atagyan:

и результат:

оператор new не вернет NULL, но при создании следующего объекта, предыдущий (удаленный в конструкторе) указатель учтен не будет, соответсвенно и удаление такого объекта не требуется.

Т.е. для вас это нормально, что test2 и test3 являют собой одно и то же?

А если после 

new MyClass(true)

не создавать объектов?


IMHO, это какой-то трэш, так нельзя кодить.

 

Добавьте локальную переменную и функцию ее считывания

private:

    bool m_isValid = false;

public:

   bool IsValid() { return m_isValid; };

...

MyClass *myClass = new MyClass();

if (!myClass.IsValid()) delete myClass;

 
Alexandr Atagyan:

и результат:

оператор new не вернет NULL, но при создании следующего объекта, предыдущий (удаленный в конструкторе) указатель учтен не будет, соответсвенно и удаление такого объекта не требуется.

MyClass instance(true);  // наслаждаемся delete GetPointer(this)

 
PapaYozh:

Т.е. для вас это нормально, что test2 и test3 являют собой одно и то же?

test2 и test3 не одно и тоже.

class MyClass
  {
public:
                     MyClass(bool del=false){if(del) delete GetPointer(this);};
                    ~MyClass(void){};
  };

MyClass  *test1,*test2,*test3;


//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   test1=new MyClass;
   test2=new MyClass(true);
   test3=new MyClass;
   
   Print("1 ",test1);
   
   int rez=CheckPointer(test2);
   switch(rez)
     {
      case  POINTER_INVALID:
         Print("POINTER_INVALID");
        break;
      case  POINTER_DYNAMIC:
         Print("POINTER_DYNAMIC");
        break;
      case  POINTER_AUTOMATIC:
         Print("POINTER_AUTOMATIC");
        break;
      default:
         Print("Error ",rez);
        break;
     }
     
   Print("3 ",test3);
   
   delete test1;
   delete test3;
  }
2021.03.25 17:52:04.601 Script 2 EURUSD,M30: removed
2021.03.25 17:52:04.598 2 EURUSD,M30: uninit reason 0
2021.03.25 17:52:04.598 2 EURUSD,M30: 3 2
2021.03.25 17:52:04.598 2 EURUSD,M30: POINTER_INVALID
2021.03.25 17:52:04.598 2 EURUSD,M30: 1 1
2021.03.25 17:52:04.598 2 EURUSD,M30: initialized
2021.03.25 17:52:04.584 Script Test\2 EURUSD,M30: loaded successfully

Я никому ничего не навязываю. Как можно кодить, а как нельзя каждый способен решить сам.

 

Напрашивается статическая функция-член класса, возвращающая объект класса.

class MyClass
{
public:
        static MyClass* create( int param )
        {
                if ( param < 10 )
                        return NULL;
                else
                        return new MyClass();
        }
};

Если что пошло не так - возвращаем NULL. Не забываем проверить, что она вернула.

Создаем так:

MyClass* a = MyClass::create( x );

Если еще и конструктор MyClass сделать приватным, то вызов MyClass::create() будет единственным способом создать объект этого класса.

Причина обращения: