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

 
TheXpert:

еще и под опекой модераторов

Кто бы говорил про опеку... но персонаж с двумя экканутами...

 
TheXpert:

еще и под опекой модераторов

Дя я вроде свой пост сам удалил. 
 
Vladimir Simakov:
Дя я вроде свой пост сам удалил. 

Это был случай, когда в функции создается объект через new. А изначально был разговор о том, что нужно передать указатель на существующий объект. И вот, его можно так передавать:

void f(CObj * obj){}

 
Dmitry Fedoseev:

А если в функцию надо передать указатель, чтобы в функции создать объект, вот так работает:

class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;

void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){
   o = new CObj();
}
Вот собственно и все, что вы хотели знать про ООП, но боялись спросить)))

У меня этот код вышибает терминал. В лучшем случае вызывает критическую ошибку в отладке (для анимации счелкните рисунок):


Странно, что такую конструкцию пропускает компилятор.

 
Ребят да прекращайте между собой грызться, тем более на ровном месте.
Дмитрий первый пример привел с ошибкой, и что тут такого?
Дим, да он компилируется без ошибок, но при запуске скрипта лезет ошибка.

Владимир его подкорректировал, и добавил указатель, код заработал правильно.
Что ещё надо? Теперь выяснять отношения кто крутой перец?  ))))
Ребят будьте уважительны друг к другу, и не переходите на личности и оскорбления с высокомерием.

Начальный пример от Дмитрия
class CObj{
   public:
   int f(){
      return(33);
   }
};

CObj * obj;


void OnStart(){
  z(obj);
  delete(obj);
}

void z(CObj & o){     //тут пропущен указатель
   o = new CObj();
}
Корректировка Владимира
void z(CObj* &o){    //добавлен указатель
   o = new CObj();
}
Моя корректировка с принтом результата метода, для проверки
Данный пример стал рабочим, что ещё надо?
Прекращайте выяснять отношения кто круче или нет, у всех бывают опечатки и ошибки.
class CObj
{
   public:
   int f(){return(33);}
};

void z(CObj* &o)
{
   o = new CObj();
   Print(o.f());
}

CObj * obj;

//+------------------------------------------------------------------+
void OnStart()
{      
  z(obj);
  delete(obj);
}
Входе данных споров, по моему выявили ошибку компилятора.
Почему компилятор пропускает компилирование без ошибок начального примера Дмитрия?
 
Vasiliy Sokolov:

У меня этот код вышибает терминал. В лучшем случае вызывает критическую ошибку в отладке:

Странно, что такую конструкцию пропускает компилятор.

Для компилятора здесь все валидно.

Создан указатель на объект в сегменте данных программы, при компиляции он инициирован 0х0.

В сегменте кода созданы необходимые команды процессору.

При исполнении на стек подняты команды по адресу функции z(...).

А там move rdx [0x0]

А обращение к нулевому адресу памяти запрещено. Разыменование нулевого указателя называется.

 
Vladimir Simakov:
Для компилятора здесь все валидно.

Для какого компилятора?

 
Vasiliy Sokolov:

У меня этот код вышибает терминал. В лучшем случае вызывает критическую ошибку в отладке (для анимации счелкните рисунок):


Странно, что такую конструкцию пропускает компилятор.

А у меня компилируется, работает правильно, но по завершению работы выводит сообщение об утечке памяти (delete не срабатывает).

 
Igor Makanu:

Вы его сейчас плохому научите, тут бы хорошему разобраться )))

#define private protected

Не зря Вы с кодами fxsaber сидели. Как по мне, это шедевр.

 

Извиняюсь за дезинформацию, ранее писал, что нельзя в дочернем классе вызвать метод Create().

Сейчас перепроверил, можно. Но доступ к private-члену m_button был недоступен. Т.е. нельзя было проверить, например, состояние кнопки: нажата/отжата.

С подсказкой Игоря теперь можно.

#define private protected
#include <Controls\Button.mqh>

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

void CMyButton::setButton(void)
{
  // метод Create() вызывается
   Create(0, "setBtn", 0, 50, 300, 150, 325);
   Text("setBtn");
   
   m_button.State();     // работает когда включаем #define private protected
}