Скачать MetaTrader 5

Гуру, прошу пояснить новичку синтаксическую запись на mql

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Почитай интервью участников Automated Trading Championship
Anton Mikheyko
223
Anton Mikheyko 2016.08.12 15:27 

Здравствуйте, уважаемые mql-программисты.

Я изучаю документацию mql и у меня возникло непонимание следующего момента.

В https://docs.mql4.com/ru/basis/function

сказано, что

Оператор return может возвращать значение выражения, стоящего в этом операторе. Значение выражения при необходимости преобразуется к типу результата функции. Можно возвращать простые типы, простые  структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур.

В https://docs.mql4.com/ru/basis/function/operationoverload

написан такой код:

class CMatrix
  {
private:
   CRow              m_rows[];
 
public:
   //--- конструкторы и деструктор
                     CMatrix(void);
                     CMatrix(int rows)  { ArrayResize(m_rows,rows);             }
                    ~CMatrix(void){};
   //--- получение размеров матрицы
   int               Rows()       const { return(ArraySize(m_rows));            }
   int               Cols()       const { return(Rows()>0? m_rows[0].Size():0); }
   //--- возвращает значения столбца в виде строки CRow
   CRow              GetColumnAsRow(const int col_index) const;
   //--- возвращает строку со значениями матрицы  
   string            String(voidconst;
   //--- оператор индексации возвращает строку по ее номеру
   CRow *operator[](int i) const        { return(GetPointer(m_rows[i]));        }
   //--- оператор сложения
   CMatrix           operator+(const CMatrix &m);
   //--- оператор умножения
   CMatrix           operator*(const CMatrix &m);
   //--- оператор присваивания
   CMatrix          *operator=(const CMatrix &m);
  };


Смущают такие записи:

CRow              GetColumnAsRow(const int col_index) const;


CMatrix           operator+(const CMatrix &m);


CMatrix           operator*(const CMatrix &m);

Тут я чего-то никак не могу понять почему такая запись разрешена?

Вроде-как в документации сказано, что в сложных структурах и классах мы не возвращаем объект, только указатель на объект?

Научите, пожалуйста, понимать правильно записи подобного рода.

Koldun Zloy
228
Koldun Zloy 2016.08.12 16:24  

Можно возвращать объекты классов и сложных структур, если у них есть конструктор копирования.

George Merts
3609
George Merts 2016.08.13 14:47  
Anton Mikheyko:
 

Вроде-как в документации сказано, что в сложных структурах и классах мы не возвращаем объект, только указатель на объект?

Научите, пожалуйста, понимать правильно записи подобного рода.

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

По-моему, правильнее принимать и возвращать указатели.

Koldun Zloy
228
Koldun Zloy 2016.08.13 16:31  

Ничего страшного в копировании объектов нет.

А вот при работе с указателями всегда стоит вопрос: кто и когда их будет освобождать.

Dmitry Fedoseev
42907
Dmitry Fedoseev 2016.08.13 20:45  
Koldun Zloy:

Ничего страшного в копировании объектов нет.

А вот при работе с указателями всегда стоит вопрос: кто и когда их будет освобождать.

Не всегда стоит вопрос об освобождении. Каким образом создавали, от этого зависит, надо ли будет беспокоиться об их удалении. Но в любом случае можно пользоваться указателями.

Если бояться проблемы удаления объектов, то волков бояться - в лес не ходить. Почти вся прелесть ООП исчезает. Лучше подумать об удалении и получить все преимущества ООП.

Вот случай. когда используется указатель, но удалять ничего не надо:

#property strict

class CTest{
   private:
      int m_val;
   public:
   void set(int val){
      m_val=val;
   }
   int get(){
      return(m_val);
   }   
};

CTest c1[10];
CTest * tmp[10];


void OnStart(){

   for(int i=0;i<10;i++){
      tmp[i]=GetPointer(c1[i]);
   }
   


}
Koldun Zloy
228
Koldun Zloy 2016.08.14 07:08  

Я не говорил, что надо бояться указателей. Я только сказал, что не нужно бояться возвращать объекты.

А Ваш пример бессмысленный и не в тему.

Dmitry Fedoseev
42907
Dmitry Fedoseev 2016.08.14 07:24  

Нужно бояться возвращать объекты, потому-что это величайшая глупость. Не страшно, но крайне тупо. Прикольно так, сначала пишешь глупость, потом начинаешь сам себе противоречить, что бы отмазаться.

Пример бессмысленный если с осмыслением сложности. Хотя, кому как, каков привет, таков и ответ.

Пример из области черного юмора для тех кто боится создавать объекты только потому-что их надо будет удалять. 

Koldun Zloy
228
Koldun Zloy 2016.08.14 07:35  

Может тему прочитаете для начала.

А потом приведёте хоть какие-нибудь аргументы.

Иначе говорить не о чем. 

Dmitry Fedoseev
42907
Dmitry Fedoseev 2016.08.14 07:42  
Koldun Zloy:

Может тему прочитаете для начала.

А потом приведёте хоть какие-нибудь аргументы.

Иначе говорить не о чем. 

Что бы аргумент возымели силу влияния, у того, для кого аргумент предназначается, должно быть в присутствии собственное соображение. Если кто-то не рекомендует создавать объекты только от того, что надо будет думать об их удалении, то наличие соображения вызывает сомнение.

А тему прочитать - да стоило бы некоторым. Здесь никто не спрашивал, хорошо ли, плохо ли возвращать объекты, или создавать их, что бы удалять. Здесь просили пояснить код.  

Koldun Zloy
228
Koldun Zloy 2016.08.14 08:01  
Если не хотите читать внимательно, я Вам поясню, мне не трудно.
Топикстартер привёл пример из документации, в котором из функции возвращается объект.
Представьте себе, Метаквоты не знают, что это "величайшая глупость".
Дальше George Merts сказал "не следует никогда возвращать в функциях сложные объекты".
Именно на это я ответил что не надо бояться их возвращать.
О том что надо бояться создавать объекты я не говорил.
Ну и попробуйте применить Ваш пример к обсуждаемой теме.
Dmitry Fedoseev
42907
Dmitry Fedoseev 2016.08.14 08:37  

Чем дальше, тем больше глупостей. 

Пример из документации показывает наличие тех или иных возможностей языка, документация совершено не касается вопроса целесообразности применения тех или иных возможностей.

Бояться возвращать объекты не надо, просто не надо делать глупости.  

Да, ни кто не писали, что надо бояться, был просто продемонстрирован это страх, или этакое умничание не впопад.

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий