Простой пример с объектом и параметрами

 

Собрался сделать передачу указателя на объект через параметр по адресу. Поскольку, обычные переменные по адресу можно свободно менять в теле функции, я подумал, что так же можно менять и указатель, передавая таким образом адрес объекта куда нужно. Но нет, такая возможность, как оказалось, отсутствует в MQL. Вот скрипт, который я написал в качестве примера, т.к. сама программа, где это обнаружилось, очень громоздкая.

//+------------------------------------------------------------------+
//|                                 получение_объекта_из_функции.mq5 |
//|                                        Copyright 2018, Cyberdev. |
//| |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Cyberdev."

class CObj{
public:
  void InfoToLog(){
    Print("Объект получен!");
  }
};

CObj * Obj = new CObj();

void ObjGet(CObj * o_Obj){
  o_Obj = GetPointer(Obj);
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
  CObj * Obj2 = NULL;
  ObjGet(Obj2);
  if(Obj2 != NULL){ 
    Obj2.InfoToLog();
  }
  else
    Print("Объект не был получен!");
  // Данный пример свидетельствует, что получить объект по адресу из функции нельзя
  delete Obj; 
}
//+------------------------------------------------------------------+

Таким образом, всё еще раз подтвердилось.

Выход из данной ситуации конечно же есть. Нужно передавать объект в качестве результата функции. Но как быть, если нужно передать множество объектов из одной функции?

 
В Вашем примере:
void ObjGet(CObj * o_Obj){
  o_Obj = GetPointer(Obj);
}

функция GetPointer не нужна. Obj - это итак готовый указатель. Нужно писать так:

void ObjGet( CObj*& o_Obj )
{
  o_Obj = Obj;
}

Точно также по ссылке, Вы можете передавать любые аргументы:  int&, float& и так далее.

// Данный пример свидетельствует, что получить объект по адресу из функции нельзя

Самоуверенность очень сильно мешает учиться.

 
Koldun Zloy:
В Вашем примере:

функция GetPointer не нужна. Obj - это итак готовый указатель. Нужно писать так:

Точно также по ссылке, Вы можете передавать любые аргументы:  int&, float& и так далее.

Самоуверенность очень сильно мешает учиться.

Дело не в моей самоуверенности или чем то еще, а дело в том что объекты через параметры не передаются:

//+------------------------------------------------------------------+
//|                                 получение_объекта_из_функции.mq5 |
//|                                        Copyright 2018, Cyberdev. |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, Cyberdev."

class CObj{
public:
  void InfoToLog(){
    Print("Объект получен!");
  }
};

CObj * Obj = new CObj();

void ObjGet(CObj * o_Obj){
  o_Obj = Obj;
}

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart(){
  CObj * Obj2 = NULL;
  ObjGet(Obj2);
  if(Obj2 != NULL){ 
    Obj2.InfoToLog();
  }
  else
    Print("Объект не был получен!");
  // Данный пример свидетельствует, что получить объект по адресу из функции нельзя
  delete Obj; 
}
//+------------------------------------------------------------------+
В программе, где я столкнулся с этим было точно так же. Указатель на объект передавался напрямую, а не через GetPointer. Разницы абсолютно никакой.
 
Mihail Matkovskij:

Дело не в моей самоуверенности или чем то еще, а дело в том что объекты через параметры не передаются:

Дело как раз в этом. Объекты через параметры передаются!

И Вам бы лучше со мной не спорить, а внимательней посмотреть на функцию, которую я Вам привёл.

 
Koldun Zloy:

Дело как раз в этом. Объекты через параметры передаются!

И Вам бы лучше со мной не спорить, а внимательней посмотреть на функцию, которую я Вам привёл.

Да, действительно, работает. Просто, невнимательно прочитал Ваше сообщение. Спасибо!

Причина обращения: