Можно возвращать объекты классов и сложных структур, если у них есть конструктор копирования.
Вроде-как в документации сказано, что в сложных структурах и классах мы не возвращаем объект, только указатель на объект?
Научите, пожалуйста, понимать правильно записи подобного рода.
На мой взгляд, не следует никогда возвращать в функциях сложные объекты. Именно потому, что в этом случае происходит неявное копирование.
По-моему, правильнее принимать и возвращать указатели.
Ничего страшного в копировании объектов нет.
А вот при работе с указателями всегда стоит вопрос: кто и когда их будет освобождать.
Ничего страшного в копировании объектов нет.
А вот при работе с указателями всегда стоит вопрос: кто и когда их будет освобождать.
Не всегда стоит вопрос об освобождении. Каким образом создавали, от этого зависит, надо ли будет беспокоиться об их удалении. Но в любом случае можно пользоваться указателями.
Если бояться проблемы удаления объектов, то волков бояться - в лес не ходить. Почти вся прелесть ООП исчезает. Лучше подумать об удалении и получить все преимущества ООП.
Вот случай. когда используется указатель, но удалять ничего не надо:
#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]); } }
Я не говорил, что надо бояться указателей. Я только сказал, что не нужно бояться возвращать объекты.
А Ваш пример бессмысленный и не в тему.
Нужно бояться возвращать объекты, потому-что это величайшая глупость. Не страшно, но крайне тупо. Прикольно так, сначала пишешь глупость, потом начинаешь сам себе противоречить, что бы отмазаться.
Пример бессмысленный если с осмыслением сложности. Хотя, кому как, каков привет, таков и ответ.
Пример из области черного юмора для тех кто боится создавать объекты только потому-что их надо будет удалять.
Может тему прочитаете для начала.
А потом приведёте хоть какие-нибудь аргументы.
Иначе говорить не о чем.
Может тему прочитаете для начала.
А потом приведёте хоть какие-нибудь аргументы.
Иначе говорить не о чем.
Что бы аргумент возымели силу влияния, у того, для кого аргумент предназначается, должно быть в присутствии собственное соображение. Если кто-то не рекомендует создавать объекты только от того, что надо будет думать об их удалении, то наличие соображения вызывает сомнение.
А тему прочитать - да стоило бы некоторым. Здесь никто не спрашивал, хорошо ли, плохо ли возвращать объекты, или создавать их, что бы удалять. Здесь просили пояснить код.
Топикстартер привёл пример из документации, в котором из функции возвращается объект.
Представьте себе, Метаквоты не знают, что это "величайшая глупость".
Дальше George Merts сказал "не следует никогда возвращать в функциях сложные объекты".
Именно на это я ответил что не надо бояться их возвращать.
О том что надо бояться создавать объекты я не говорил.
Ну и попробуйте применить Ваш пример к обсуждаемой теме.
Чем дальше, тем больше глупостей.
Пример из документации показывает наличие тех или иных возможностей языка, документация совершено не касается вопроса целесообразности применения тех или иных возможностей.
Бояться возвращать объекты не надо, просто не надо делать глупости.
Да, ни кто не писали, что надо бояться, был просто продемонстрирован это страх, или этакое умничание не впопад.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, уважаемые mql-программисты.
Я изучаю документацию mql и у меня возникло непонимание следующего момента.
В https://docs.mql4.com/ru/basis/function
сказано, что
Оператор return может возвращать значение выражения, стоящего в этом операторе. Значение выражения при необходимости преобразуется к типу результата функции. Можно возвращать простые типы, простые структуры, указатели объектов. При помощи оператора return нельзя возвращать любые массивы, объекты классов, переменные типа сложных структур.
В https://docs.mql4.com/ru/basis/function/operationoverload
написан такой код:
{
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(void) const;
//--- оператор индексации возвращает строку по ее номеру
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);
};
Смущают такие записи:
Тут я чего-то никак не могу понять почему такая запись разрешена?
Вроде-как в документации сказано, что в сложных структурах и классах мы не возвращаем объект, только указатель на объект?
Научите, пожалуйста, понимать правильно записи подобного рода.