Структура MQL4, содержащая адрес для других структур - PullRequest
0 голосов
/ 28 января 2020

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

struct ConditionSet
  {
      int            CondsNbr;                     // Number of cond-s in the set
      bool           TabConds         [MaxConditions];
      string         TabCondsLabel    [MaxConditions];
      int            CandleNum        [MaxConditions];
      bool           ExitCondition;
      int            int1, int2, int3, int4, int5; // user integers
      double         d1, d2, d3,d4, d5;            // user doubles
  };

struct Transaction
  {
      string         Strategie_name;
      string         Symbol;

      bool           BuyReady;
      bool           SellReady;

      bool           BuyRunning;
      bool           SellRunning;

      ConditionSet  & conditionsAchat;   // HERE, THIS IS NOT A CORRECT SYNTAX
      ConditionSet  & conditionsVente;   // HERE, THIS IS NOT A CORRECT SYNTAX

      int            ticketAchat;
      int            ticketVente;
  };

Ответы [ 2 ]

0 голосов
/ 28 января 2020

Спасибо, что ответили.

После перемещения класса Foo в верхнюю часть источника и добавления строгого свойства я могу скомпилировать ваш источник.

Я не понимаю line int Foo :: s_counter = 0;

Что это делает?

Я думаю, как классы могут решить мою проблему, но это не так просто.

Janfi

0 голосов
/ 28 января 2020

Если структура содержит переменные типа строки и / или объекта массива динамического c, компилятор назначает такой структуре неявный конструктор. Этот конструктор сбрасывает все элементы структуры строкового типа и правильно инициализирует объекты массива Dynami c.

Указатели объектов

В MQL4 есть возможность динамически создавать объекты сложного типа. Это делается оператором new, который возвращает дескриптор созданного объекта. Дескриптор размером 8 байт. Синтаксически дескрипторы объектов в MQL4 похожи на указатели в C ++.

MyObject* hobject= new MyObject();

In контрастность по отношению к C ++, переменная hobject из приведенного выше примера не a указатель на память , но скорее дескриптор объекта. Кроме того, в MQL5 все объекты в параметрах функции должны передаваться по ссылке.

//+------------------------------------------------------------------+
//| Objects are always passed by reference                           |
//+------------------------------------------------------------------+
void PrintObject(Foo &object)
  {
   Print(__FUNCTION__,": ",object.m_id," Object name=",object.m_name);
  }
//+------------------------------------------------------------------+
//| Passing an array of objects                                      |
//+------------------------------------------------------------------+
void PrintObjectsArray(Foo &objects[])
  {
   int size=ArraySize(objects);
   for(int i=0;i<size;i++)
     {
      PrintObject(objects[i]);
     }
  }
//+------------------------------------------------------------------+
//| Passing an array of pointers to object                           |
//+------------------------------------------------------------------+
void PrintPointersArray(Foo* &objects[])
  {
   int size=ArraySize(objects);
   for(int i=0;i<size;i++)
     {
      PrintObject(objects[i]);
     }
  }
//+------------------------------------------------------------------+
class Foo
  {
public:
   string            m_name;
   int               m_id;
   static int        s_counter;
   //--- constructors and desctructors
                     Foo(void){Setup("noname");};
                     Foo(string name){Setup(name);};
                    ~Foo(void){};
   //--- initializes object of type Foo
   void              Setup(string name)
     {
      m_name=name;
      s_counter++;
      m_id=s_counter;
     }
  };
//+------------------------------------------------------------------+
int Foo::s_counter=0;
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//--- declare an object as variable with its automatic creation
   Foo foo1;
//--- variant of passing an object by reference
   PrintObject(foo1);

//--- declare a pointer to an object and create it using the 'new' operator
   Foo *foo2=new Foo("foo2");
//--- variant of passing a pointer to an object by reference
   PrintObject(foo2); // pointer to an object is converted automatically by compiler

//--- declare an array of objects of type Foo
   Foo foo_objects[5];
//--- variant of passing an array of objects
   PrintObjectsArray(foo_objects); // separate function for passing an array of objects

//--- declare an array of pointers to objects of type Foo
   Foo *foo_pointers[5];
   for(int i=0;i<5;i++)
     {
      foo_pointers[i]=new Foo("foo_pointer");
     }
//--- variant of passing an array of pointers
   PrintPointersArray(foo_pointers); // separate function for passing an array of pointers

//--- it is obligatory to delete objects created as pointers before termination
   delete(foo2);
//--- delete array of pointers
   int size=ArraySize(foo_pointers);
   for(int i=0;i<5;i++)
      delete(foo_pointers[i]);
//---   
  }
//+------------------------------------------------------------------+

Ключевое слово this

Переменная класса Тип (объект) может быть передан как по ссылке, так и по указателю. Как и ссылка, указатель позволяет иметь доступ к объекту. После того, как указатель объекта объявлен, новый оператор должен быть применен к нему, чтобы создать и инициализировать его.

Зарезервированное слово this предназначено для получения ссылки на объект, который доступен внутри методов класса или структуры. this всегда ссылается на объект, в методе которого он используется, а выражение GetPointer(this) дает указатель на объект, членом которого является функция, в которой вызов GetPointer() выполняется. В MQL4 функции не могут возвращать объекты, но они могут возвращать указатель на объект.

...