Ошибки, баги, вопросы - страница 1873 1...186618671868186918701871187218731874187518761877187818791880...3776 Новый комментарий fxsaber 2017.04.24 19:16 #18721 Koldun Zloy: Объект класса с закрытым конструктором можно создать только при помощи специальной статической функции этого класса.Хотя сейчас компилятор не ругается на код, который Вы привели, в будущем это обязательно исправят.Предложенный стат. метод в таком случае будет некоторым самообманом, т.к. по сути он и будет являться конструктором. И его явно надо будет вызывать.Для того чтобы вызвать деструктор можно использовать умный указатель.При этом деструктор должен быть открытым.Что такое умный указатель? [Удален] 2017.04.25 04:16 #18722 Если Вы уверены, что конструктор должен быть закрытым, то по другому никак.Умный указатель это объект, который содержит в себе простой указатель и обеспечивает его своевременное удаление.class MyClass { public: MyClass(); }; struct MyClassPtr { MyClass* pMyClass; MyClassPtr( MyClass* myClass ) : pMyClass( myClass ) { } ~MyClassPtr() { delete pMyClass; } };Это самый простой вариант.Бывают и более сложные умные указатели.Очень хорошо про них написано в этой книге: https://rsdn.org/res/book/cpp/cpp_real_programmers.xml C++ : библиотека программиста rsdn.org Глава 5. Умные указатели Глава 6. Ведущие указатели и дескрипторы Глава 7. Грани и другие мудрые указатели Глава 8. Коллекции, курсоры, итераторы Глава 9. Транзакции и гениальные указатели MQL5 Компилятор не различает ООП. Вопросы применения Указатели и объекты. Кто Konstantin 2017.04.25 05:24 #18723 чего не хватает, что бы скомпилировался код:class CMyClass { public: void* core; CMyClass(void) : core(NULL) { } template<typename T> void Create(T* a_ptr) { core = dynamic_cast<T *> (a_ptr); } }; class CCore { public: int var; CCore(void) : var(3) { } }; int OnInit() { CCore *_point_1 = new CCore(); CMyClass _obj; _obj.Create(_point_1); int _val = _obj.core.var; delete _point_1; //--- return INIT_SUCCEEDED; }в данном варианте пишет 'var' - struct member undefinedPS. понял в чем ошибка ))int _val = dynamic_cast <CCore *>(_obj.core).var; fxsaber 2017.04.25 06:23 #18724 void* с какого билда в языке? Sergey Dzyublik 2017.04.25 06:34 #18725 fxsaber: void* с какого билда в языке?тогда, когда и интерфейсы появились fxsaber 2017.04.25 07:58 #18726 Sergey Dzyublik: тогда, когда и интерфейсы появилисьСпасибо. Правда, сразу нарвался на ошибкуstruct PTR { void* Ptr; // internal error #40 }; fxsaber 2017.04.25 08:19 #18727 Koldun Zloy: Если Вы уверены, что конструктор должен быть закрытым, то по другому никак.Умный указатель это объект, который содержит в себе простой указатель и обеспечивает его своевременное удаление.Это самый простой вариант.Бывают и более сложные умные указатели.Очень хорошо про них написано в этой книге: https://rsdn.org/res/book/cpp/cpp_real_programmers.xml Спасибо! Пробовал различные варианты, но не выходит никакtemplate <typename T> struct PTR { T* Ptr; PTR( void ) { } void operator =( T* &Value ) { this.Ptr = Value; } ~PTR( void ) { Print(__FUNCSIG__); delete this.Ptr; } }; class CLASS { private: static CLASS* Tmp; static PTR<CLASS> Ptr; CLASS() { CLASS::Ptr = CLASS::Tmp; } }; static CLASS* CLASS::Tmp = new CLASS; static PTR<CLASS> CLASS::Ptr; void OnStart() { }Собственно, логично, что не выходит. Заставить вызываться деструктор умного указателя раньше деструктора класса нельзя. fxsaber 2017.04.25 09:05 #18728 Компилятор вместо указания ошибки и места, где она возникает, выдает неопределенный internal error #112class CLASS {}; template <typename T> class CLASS2 { public: static void Func() {} }; void OnStart() { CLASS2<CLASS>::Func; } [Удален] 2017.04.25 09:22 #18729 fxsaber: Спасибо! Пробовал различные варианты, но не выходит никакСобственно, логично, что не выходит. Заставить вызываться деструктор умного указателя раньше деструктора класса нельзя.Попробуйте так:template < typename T > struct PTR { T* Ptr; PTR( T* Value ) : Ptr( Value ) { } ~PTR() { Print(__FUNCSIG__); delete Ptr; } }; class CLASS { private: static PTR< CLASS > Ptr; public: CLASS() { Print(__FUNCSIG__); } ~CLASS() { Print(__FUNCSIG__); } }; static PTR< CLASS > CLASS::Ptr( new CLASS ); void OnStart() { } Уж не знаю, что Вы такое делаете, но в MQL делать конструктор закрытым, имеет смысл только для синглтона. fxsaber 2017.04.25 09:53 #18730 Koldun Zloy: Попробуйте так:Спасибо за подробный пример! К сожалению, в нем конструктор не закрытый. С закрытым, конечно, не получается так.Мне нужно, чтобы существовал скрытый от всех объект. При этом другой объект такого типа нельзя было никак создать. MetaEditor build 1471 Объекты на графике Вопросы от начинающих MQL5 1...186618671868186918701871187218731874187518761877187818791880...3776 Новый комментарий
Объект класса с закрытым конструктором можно создать только при помощи специальной статической функции этого класса.
Хотя сейчас компилятор не ругается на код, который Вы привели, в будущем это обязательно исправят.
Предложенный стат. метод в таком случае будет некоторым самообманом, т.к. по сути он и будет являться конструктором. И его явно надо будет вызывать.
Для того чтобы вызвать деструктор можно использовать умный указатель.
При этом деструктор должен быть открытым.
Если Вы уверены, что конструктор должен быть закрытым, то по другому никак.
Умный указатель это объект, который содержит в себе простой указатель и обеспечивает его своевременное удаление.
Это самый простой вариант.
Бывают и более сложные умные указатели.
Очень хорошо про них написано в этой книге: https://rsdn.org/res/book/cpp/cpp_real_programmers.xml
чего не хватает, что бы скомпилировался код:
в данном варианте пишет 'var' - struct member undefined
PS. понял в чем ошибка ))
int _val = dynamic_cast <CCore *>(_obj.core).var;void* с какого билда в языке?
тогда, когда и интерфейсы появились
тогда, когда и интерфейсы появились
Если Вы уверены, что конструктор должен быть закрытым, то по другому никак.
Умный указатель это объект, который содержит в себе простой указатель и обеспечивает его своевременное удаление.
Это самый простой вариант.
Бывают и более сложные умные указатели.
Очень хорошо про них написано в этой книге: https://rsdn.org/res/book/cpp/cpp_real_programmers.xml
Собственно, логично, что не выходит. Заставить вызываться деструктор умного указателя раньше деструктора класса нельзя.
Компилятор вместо указания ошибки и места, где она возникает, выдает неопределенный internal error #112
Спасибо! Пробовал различные варианты, но не выходит никак
Собственно, логично, что не выходит. Заставить вызываться деструктор умного указателя раньше деструктора класса нельзя.
Попробуйте так:
Уж не знаю, что Вы такое делаете, но в MQL делать конструктор закрытым, имеет смысл только для синглтона.
Попробуйте так:
Спасибо за подробный пример! К сожалению, в нем конструктор не закрытый. С закрытым, конечно, не получается так.
Мне нужно, чтобы существовал скрытый от всех объект. При этом другой объект такого типа нельзя было никак создать.