Никак. Фабрика с предварительной проверкой параметров.
попробовал
delete GetPointer(this);
вроде работает.
попробовал
вроде работает.
Как-то стрёмно такое делать в конструкторе.
А оператор 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, но при создании следующего объекта, предыдущий (удаленный в конструкторе) указатель учтен не будет, соответсвенно и удаление такого объекта не требуется.
и результат:
оператор 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;
и результат:
оператор new не вернет NULL, но при создании следующего объекта, предыдущий (удаленный в конструкторе) указатель учтен не будет, соответсвенно и удаление такого объекта не требуется.
MyClass instance(true); // наслаждаемся delete GetPointer(this)
Т.е. для вас это нормально, что 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() будет единственным способом создать объект этого класса.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Имеется класс с параметрическим конструктором. Далее в коде создается новый объект класса оператором new.
Как в конструкторе, по результату проверки входных параметров, прервать инициализацию и не создавать новый объект класса?