Пользовательские типы данных и указатели

 

В справке есть пример реализации пользовательских типов в котором используются указатели на функции.

Пользовательские типы - Типы данных - Основы языка - Справочник MQL4

При компиляции полного исходного кода примера, возникает ошибка в строке

AddButton(new MyButton("Open",Open)); 

'MyButton' - no one of the overloads can be applied to the function call

Подскажите, как правильно?


Документация по MQL5: Основы языка / Типы данных / Пользовательские типы
Документация по MQL5: Основы языка / Типы данных / Пользовательские типы
  • www.mql5.com
Пользовательские типы - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
SanAlex:

Интересует правильное применение указателей.

 
Alexandr Atagyan:

Интересует правильное применение указателей.

следующая глава

https://docs.mql4.com/ru/basis/types/object_pointers

Указатели объектов - Типы данных - Основы языка - Справочник MQL4
Указатели объектов - Типы данных - Основы языка - Справочник MQL4
  • docs.mql4.com
Указатели объектов - Типы данных - Основы языка - Справочник MQL4
 
Alexandr Atagyan:

В справке есть пример реализации пользовательских типов в котором используются указатели на функции.

Пользовательские типы - Типы данных - Основы языка - Справочник MQL4

При компиляции полного исходного кода примера, возникает ошибка в строке

'MyButton' - no one of the overloads can be applied to the function call

Подскажите, как правильно?


Добавьте метод

 bool              AddButton(MyButton *button){return(m_buttons.Add(button));m_buttons.Sort();};

по аналогии с существующем AddButton(MyButton &)






 
Maxim Kuznetsov:

Добавьте метод

 bool              AddButton(MyButton *button){return(m_buttons.Add(button));m_buttons.Sort();};

по аналогии с существующем AddButton(MyButton &)






Благодарю!

 
Alexandr Atagyan:

В справке есть пример реализации пользовательских типов в котором используются указатели на функции.

Пользовательские типы - Типы данных - Основы языка - Справочник MQL4

При компиляции полного исходного кода примера, возникает ошибка в строке

'MyButton' - no one of the overloads can be applied to the function call

Подскажите, как правильно?



А код примера полностью перенесён в код программы?

Для  MyButton есть public конструктор, который принимает параметры требуемых типов?

 
PapaYozh:


А код примера пример полностью перенесён в код программы?

Для  MyButton есть public конструктор, который принимает параметры требуемых типов?

//+------------------------------------------------------------------+ 
//|                                                Panel_Buttons.mq5 | 
//|                        Copyright 2017, MetaQuotes Software Corp. | 
//|                                             https://www.mql5.com | 
//+------------------------------------------------------------------+ 
  
#property copyright "Copyright 2017, MetaQuotes Software Corp." 
#property link      "https://www.mql5.com" 
#property version   "1.00" 
#property description "Панель с несколькими кнопками CButton" 
#include <Controls\Dialog.mqh> 
#include <Controls\Button.mqh> 
//+------------------------------------------------------------------+ 
//| defines                                                          | 
//+------------------------------------------------------------------+ 
//--- indents and gaps 
#define INDENT_LEFT                         (11)      // indent from left (with allowance for border width) 
#define INDENT_TOP                          (11)      // indent from top (with allowance for border width) 
#define CONTROLS_GAP_X                      (5)       // gap by X coordinate 
#define CONTROLS_GAP_Y                      (5)       // gap by Y coordinate 
//--- for buttons 
#define BUTTON_WIDTH                        (100)     // size by X coordinate 
#define BUTTON_HEIGHT                       (20)      // size by Y coordinate 
//--- for the indication area 
#define EDIT_HEIGHT                         (20)      // size by Y coordinate 
  
//--- создадим пользовательский тип функции 
typedef int(*TAction)(string,int); 
//+------------------------------------------------------------------+ 
//|  Открывает файл                                                  | 
//+------------------------------------------------------------------+ 
int Open(string name,int id) 
  { 
   PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id); 
   return(1); 
  } 
//+------------------------------------------------------------------+ 
//|  Сохраняет файл                                                  | 
//+------------------------------------------------------------------+ 
int Save(string name,int id) 
  { 
   PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id); 
   return(2); 
  } 
//+------------------------------------------------------------------+ 
//|  Закрывает файл                                                  | 
//+------------------------------------------------------------------+ 
int Close(string name,int id) 
  { 
   PrintFormat("Вызвана функция %s (name=%s id=%d)",__FUNCTION__,name,id); 
   return(3); 
  } 
//+------------------------------------------------------------------+ 
//| Создадим свой класс кнопки с функцией обработки событий          | 
//+------------------------------------------------------------------+ 
class MyButton: public CButton 
  { 
private: 
   TAction           m_action;                    // обработчик событий графика 
public: 
                     MyButton(void){} 
                    ~MyButton(void){} 
   //--- конструктор с указанием текста кнопки и указателя на функцию для обработки событий 
                     MyButton(string text,TAction act) 
     { 
      Text(text); 
      m_action=act; 
     } 
   //--- установка собственной функции, которая будет вызываться из обработчика событий OnEvent() 
   void              SetAction(TAction act){m_action=act;} 
   //--- стандартный обработчик событий графика 
   virtual bool      OnEvent(const int id,const long &lparam,const double &dparam,const string &sparam) override 
     { 
      if(m_action!=NULL && lparam==Id()) 
        { 
         //--- вызовем собственный обработчик 
         m_action(sparam,(int)lparam); 
         return(true); 
        } 
      else 
      //--- вернем  результат вызова обработчика из родительского класса CButton 
         return(CButton::OnEvent(id,lparam,dparam,sparam)); 
     } 
  }; 
//+------------------------------------------------------------------+ 
//| Класс CControlsDialog                                            | 
//| Назвначение: графическая панель для управления приложением       | 
//+------------------------------------------------------------------+ 
class CControlsDialog : public CAppDialog 
  { 
private: 
   CArrayObj         m_buttons;                     // массив кнопок 
public: 
                     CControlsDialog(void){}; 
                    ~CControlsDialog(void){}; 
   //--- create 
   virtual bool      Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) override; 
   //--- добавление кнопки 
   bool              AddButton(MyButton &button){return(m_buttons.Add(GetPointer(button)));m_buttons.Sort();}; 
   bool              AddButton(MyButton *button){return(m_buttons.Add(button));m_buttons.Sort();};
protected: 
   //--- создание кнопок  
   bool              CreateButtons(void); 
  }; 
//+------------------------------------------------------------------+ 
//| Создание объекта CControlsDialog на графике                      | 
//+------------------------------------------------------------------+ 
bool CControlsDialog::Create(const long chart,const string name,const int subwin,const int x1,const int y1,const int x2,const int y2) 
  { 
   if(!CAppDialog::Create(chart,name,subwin,x1,y1,x2,y2)) 
      return(false); 
   return(CreateButtons()); 
//--- 
  } 
//+------------------------------------------------------------------+ 
//| Создание и добавление кнопок на панель CControlsDialog           | 
//+------------------------------------------------------------------+ 
bool CControlsDialog::CreateButtons(void) 
  { 
//--- расчет координат кнопок 
   int x1=INDENT_LEFT; 
   int y1=INDENT_TOP+(EDIT_HEIGHT+CONTROLS_GAP_Y); 
   int x2; 
   int y2=y1+BUTTON_HEIGHT; 
//--- добавим объекты кнопок вместе с указателями на функции 
   AddButton(new MyButton("Open",Open)); 	//'MyButton' - no one of the overloads can be applied to the function call
   AddButton(new MyButton("Save",Save)); 
   AddButton(new MyButton("Close",Close));	//'MyButton' - no one of the overloads can be applied to the function call
//--- создадим кнопки графически 
   for(int i=0;i<m_buttons.Total();i++) 
     { 
      MyButton *b=(MyButton*)m_buttons.At(i); 
      x1=INDENT_LEFT+i*(BUTTON_WIDTH+CONTROLS_GAP_X); 
      x2=x1+BUTTON_WIDTH; 
      if(!b.Create(m_chart_id,m_name+"bt"+b.Text(),m_subwin,x1,y1,x2,y2)) 
        { 
         PrintFormat("Failed to create button %s %d",b.Text(),i); 
         return(false); 
        } 
      //--- добавим каждую кнопку в контейнер CControlsDialog 
      if(!Add(b)) 
         return(false); 
     } 
//--- succeed 
   return(true); 
  } 
//--- объявим объект на глобальном уровне, чтобы создать его автоматически при запуске программы 
CControlsDialog MyDialog; 
//+------------------------------------------------------------------+ 
//| Expert initialization function                                   | 
//+------------------------------------------------------------------+ 
int OnInit() 
  { 
//--- теперь создадим объект на графике 
   if(!MyDialog.Create(0,"Controls",0,40,40,380,344)) 
      return(INIT_FAILED); 
//--- запускаем приложение 
   MyDialog.Run(); 
//--- успешная инициализация приложения 
   return(INIT_SUCCEEDED); 
  } 
//+------------------------------------------------------------------+ 
//| Expert deinitialization function                                 | 
//+------------------------------------------------------------------+ 
void OnDeinit(const int reason) 
  { 
//--- очистим комментарии при завершении работы приложения 
   Comment(""); 
//--- destroy dialog 
   MyDialog.Destroy(reason); 
  } 
//+------------------------------------------------------------------+ 
//| Expert chart event function                                      | 
//+------------------------------------------------------------------+ 
void OnChartEvent(const int id,         // event ID   
                  const long& lparam,   // event parameter of the long type 
                  const double& dparam, // event parameter of the double type 
                  const string& sparam) // event parameter of the string type 
  { 
//--- для событий графика вызываем обработчика из родительского класса (CAppDialog в данном случае) 
   MyDialog.ChartEvent(id,lparam,dparam,sparam); 
  }

вот полный код примера с исправлениями.

Оставшиеся ошибки выделены.

 
Alexandr Atagyan:

вот полный код примера с исправлениями.

Оставшиеся ошибки выделены.

Нужно переименовать функции Open и Close. Ведь это зарезервированные слова. По единичке хотя бы к ним добавьте.

 
Ihor Herasko:

Нужно переименовать функции Open и Close. Ведь это зарезервированные слова. По единичке хотя бы к ним добавьте.

Так и сделал. Странно что в справке привели именно такой пример.

 
Alexandr Atagyan:

Так и сделал. Странно что в справке привели именно такой пример.

Его из МQL5 перенесли как есть. Там Open и Close - незарезервированные слова.

 
Ihor Herasko:

Его из МQL5 перенесли как есть. Там Open и Close - незарезервированные слова.

Попробовал скомпилировать в 5. Компилятор выдает ошибку в строке 

AddButton(new MyButton("Save",Save));

Как ни крути, пример не самый удачный.