MQL5. Вопрос про обратную ссылку объектов

 
Привет. Проблема такая. Хочу построить модель.   Допустим два класса Ордер и Сделка.  В классе Ордер есть массив связанных сделок. Также я хочу из сделки получить ордер породивший её.
Но в MQL невозможно дать такую ссылку, т.к. просто компилятор не видит класс написанный ниже по коду. С таким не сталкивался в других языках. 
По разным файлам #include классы разбрасывать так понимаю тоже бесполезно..  
Вижу только решение ссылки на класс предка. Но тогда будет приведение типов в коде и т.д..

  Как быть?

class Deal
{
   double Price;//неважно
   
   //Ссылка на ордер породивший сделку
   //Объявить так невозможно, т.к. класс ордера НИЖЕ по коду. Ограничение компилятора
   //Как быть???
  
    Order  OrderCurent; //Error  'Order' - declaration without type
   
};

class Order 
{
   double param1;//неважно

   Deal  deals[];//Ссылки на сделки, которые порождены ордером  
   
};

//пример использования
  Order ord1=getOrder();//К примеру    
   Deal or1_deal1 = ord1.deals[0];// Извлечение ордера
  
  //А наобарот...
  Order Z= or1_deal1.OrderCurent;  //Получение ордера, порадившего сделку. КААААК????

 
juriy5555:
Как быть?

Попробуйте так:

class Order;
class Deal
{
public:
   double Price;                //неважно
   Order*  OrderCurrent;        //Error  'Order' - declaration without type
};

class Order 
{
   double param1;    //неважно
   Deal  deals[];    //Ссылки на сделки, которые порождены ордером  
};
 

Спасибо, совсем не догадался, что можно декларировать заранее. Но даже там нюанс уже нашел при перестановке местами..   Да, и про ссылки, указатели тоже тут...
В C# в этом плане всё гораздо нагляднее. Все переменные сложного типа -ссылки.  Создаёшь новый объект через New и неважно ...  А тут они сами создаются, если забыть поставить "указатель". Да и сборщика мусора нет.  Короче ужас. всё намного более неудачнее.   

 

class Order;

class Deal;

class Order 

{

 public:

   double param1;    //неважно

   Deal * deals[];    //Ссылки на сделки, которые порождены ордером  

      

   void AddDeal(Deal & deal )

   {

      int len=ArraySize(deals);

      ArrayResize(deals,len+1);

      deals[len]=&deal;

      deal.CurentOrder=&this;

   }

};



class Deal 

{

 public:

   double param1;    //неважно

   Order  * CurentOrder;    //Ссылки на сделки, которые порождены ордером 

};



  Order order1;  

 Deal deal1;  

  order1.param1=2;

  deal1.param1=2; 

  

  order1.AddDeal(deal1);  

  Order * test=deal1.CurentOrder; 
 
juriy5555:

Спасибо, совсем не догадался, что можно декларировать заранее. Но даже там нюанс уже нашел при перестановке местами..   Да, и про ссылки, указатели тоже тут...
В C# в этом плане всё гораздо нагляднее. Все переменные сложного типа -ссылки.  Создаёшь новый объект через New и неважно ...  А тут они сами создаются, если забыть поставить "указатель". Да и сборщика мусора нет.  Короче ужас. всё намного более неудачнее.   

Здесь Вам не там:) MQL по-своему хорош.
 
Vasiliy Sokolov:
Здесь Вам не там:) MQL по-своему хорош.

Я сейчас вспомнил как Алла Пугачёва отозвалась о Раймонде Паулсе: "Этот человек может даже из доски извлекать прекрасную музыку".

Это можно перефразировать на специалиста в любом деле.

 
juriy5555:

Спасибо, совсем не догадался, что можно декларировать заранее. Но даже там нюанс уже нашел при перестановке местами..   Да, и про ссылки, указатели тоже тут...
В C# в этом плане всё гораздо нагляднее. Все переменные сложного типа -ссылки.  Создаёшь новый объект через New и неважно ...  А тут они сами создаются, если забыть поставить "указатель". Да и сборщика мусора нет.  Короче ужас. всё намного более неудачнее.   

В шарпе указатели вообще используются как unsafe и их использование - исключение из правил. В MQL4/5 реальных указателей, как в С/С++ нет, есть дескрипторы, но форма записи, как у указателей через *.

В новой версии МТ5 ввели указатели на функции, может, пригодится. Вот ссылка на статью, ниже вырезка про указатели на функции. https://www.mql5.com/ru/forum/23/page18#comment_2431727

--------------------------------- 

MQL5: Для облегчения организации событийных моделей добавлена поддержка указателей на функции.

Чтобы объявить указатель на функцию, определите тип "указатель на функцию", например:
typedef int (*TFunc)(int,int);
Теперь TFunc является типом и можно объявить переменную-указатель на функцию:
TFunc func_ptr;
В переменную func_ptr можно сохранить адрес функции, чтобы в дальнейшем ее вызывать:
int sub(int x,int y) { return(x-y); }
int add(int x,int y) { return(x+y); }
int neg(int x)       { return(~x);  }

func_ptr=sub;
Print(func_ptr(10,5));

func_ptr=add;
Print(func_ptr(10,5));

func_ptr=neg;           // ошибка: neg не имеет тип  int (int,int)
Print(func_ptr(10));    // ошибка: должно быть два параметра

Указатели на функции можно хранить и передавать в качестве параметра. Нельзя получить указатель на нестатический метод класса. 

Список изменений в билдах MetaTrader 5 Client Terminal
Список изменений в билдах MetaTrader 5 Client Terminal
  • www.mql5.com
Автоматическое обновление доступно через систему LiveUpdate:. - Страница 18 - Категория: общее обсуждение
 

В mql ссылки тоже есть, для этого нужно в функции после типа параметра поставить символ &.

void OnStart()
  {
//---
   int tmpInteger = 42;
   Print(tmpInteger); //42
   AddTen1(tmpInteger);
   Print(tmpInteger); //42 - без изменеий
   AddTen2(tmpInteger);
   Print(tmpInteger); //52 - изменение
   
  }
//+------------------------------------------------------------------+

void AddTen1(int i){
   i += 10;
}

void AddTen2(int& i){
   i += 10;
}

 AddTen2 получит ссылку на переменную, и любые действия с ней отразятся и вне функции. А всё что без символа & - то не будет ссылкой, логика довольно проста :)