Вопросы по ООП в MQL5 - страница 12

 
Vasiliy Pushkaryov:

Подскажите еще по одному вопросу. Если создать дочерний класс CMyButton от CButton, то создать кнопку, а потом менять ее свойства вне класса можно. Ниже это сделано в OnInit().

Но если я хочу внутри дочернего класса сделать дополнительные поля, а также использовать в новых функциях встроенные свойства класса CButton, то как это правильно реализовать?

В классе CButton член класса m_button объявлен в private секции.

В private секцию родительского класса не получается влезть. 

Может быть, сделать просто и прямо - посмотреть как формируется имя графического объекта в классе CButton и работать напрямую с этими графическими объектами. Тем более с кнопкой должно быть просто, в ней всего один графический объект.

 
TheXpert:

Ага, уже два несвязанных человека фотошопят креш твоего кода )

Твой код не может работать правильно, это очевидно по самому коду ))

Два человека? Из твоей фантазии, да? Хоть бы читал внимательней, или, хотя бы картинки внимательней смотрел. У первого сообщение из дебагера. А без дебагера и компилируется и работает. 

 
Dmitry Fedoseev:

Два человека? Из твоей фантазии, да? Хоть бы читал внимательней, или, хотя бы картинки внимательней смотрел. У первого сообщение из дебагера. А без дебагера и компилируется и работает. 

у меня без дебагера крешится )

и в дебагере крешится ))

может ты просто не знаешь где лог выдачи скрипта посмотреть? )))

 
TheXpert:

у меня без дебагера крешится )

и в дебагере крешится ))

может ты просто не знаешь где лог выдачи скрипта посмотреть? )))

Не, не  в курсе, а расскажи где это.

 
Vasiliy Pushkaryov:

Подскажите еще по одному вопросу. Если создать дочерний класс CMyButton от CButton, то создать кнопку, а потом менять ее свойства вне класса можно. Ниже это сделано в OnInit().

Но если я хочу внутри дочернего класса сделать дополнительные поля, а также использовать в новых функциях встроенные свойства класса CButton, то как это правильно реализовать?

В классе CButton член класса m_button объявлен в private секции.

по моему Вы опять со стороны хвоста решаете свою задачу , я бы все таки посоветовал эту задачу с другой стороны решать:

class CMyButton : public CButton
{ 
  private: 
   CButton        *mybtn;
  public: 
              CMyButton(void){}; 
             ~CMyButton(void){}; 
             
        bool    isPrevState;        // состояние кнопки на предыд.тике, true - была нажата     
        void    setButton();        // создаем кнопку
        void    setProp();          // задаем в ходе программы свойства
}; 

void CMyButton::setButton(void)
{
  mybtn = new CButton;
  mybtn.Create(....................);
  // как в этой функции создать кнопку? Я не могу вызвать метод Create()


Dmitry Fedoseev:

В private секцию родительского класса не получается влезть. 

влезть можно как минимум через #define и можно с dynamic_cast  поэкспериментировать, в прошлом году изучал возможности dynamic_cast  - удивительные вещи позволяет делать, но это трудоемкий процесс


TheXpert:

у меня без дебагера крешится )

проверил - я тоже получил: 2019.07.05 17:10:27.307 1 (EURUSD,H1) invalid pointer access in '1.mq5' (43,6)

 

А заинтриговали вы меня, и я подумал, а может я и правда идиот, коим вы меня считаете. Откопал код, который писал 5 лет тому назад, вот фрагмент:

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

***

Да и с тем мои кодом, несмотря на то, что он компилируется и работает, очень быстро становится понятно, что с ним что-то не то. Объект не удаляется через delete.

Но ведь вам приятно верить, что я даже не знаю что такое: CObj obj; продолжайте верить...

***

Но свои уши до самых пяток готовы отморозить "на зло дедушке". Даже сборщик мусора у них появился в MQL.

 
Dmitry Fedoseev:

А заинтриговали вы меня, и я подумал, а может я и правда идиот, коим вы меня считаете. Откопал код, который писал 5 лет тому назад, вот фрагмент:

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

Тут все правильно, ссылка на указатель, а тот, из-за которого весь сыр-бор, ссылка на объект которого нет. Внимательно код посмотрите.
 
Vladimir Simakov:
Тут все правильно, ссылка на указатель, а тот, из-за которого весь сыр-бор, ссылка на объект которого нет. Внимательно код посмотрите.

Вы что правда считаете, что я не могу заметить что в одном месте *, а в другом * &?

И вы тоже верите, что я не знаю что такое CObj obj; ?

 
Vladimir Simakov:
...ссылка на объект которого нет..

Но ведь компилируется и работает.

 
Dmitry Fedoseev:

Вы что правда считаете, что я не могу заметить что в одном месте *, а в другом * &?

И вы тоже верите, что я не знаю что такое CObj obj; ?

Вы это сделали
void z(CObj & o){
   o = new CObj();
}
Причина обращения: