Вопросы по ООП в MQL5 - страница 43

 
Igor Makanu:

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

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

 
A100:

Подача заставляет думать... сами же писали что начали думать над кодом, а раньше кодили тяп-ляп

хм... ну тяп ляп никогда не писал! - это факт!

ЗЫ: топик апаю периодически не от незнания, или не от того,что не способен самостоятельно найти материал, а от того что есть актив, мнение которого мне интересно ;)

ЗЫЗЫ: результат общения -  довольно сильно переосмыслил зачем использовать модификаторы, зачем нужны гет/сет - это экономит время на этапе разработке, при умелом использовании помощи компилятора, тестирование написанного кода будет сразу успешным - тут действительно раскрыли глаза, кто был актив в топике, еще раз благодарю!

 
Koldun Zloy:

Вот пример:

Из Вашего кода непонятно зачем нужен интерфейс, поэтому я его выкинул.

Я конечно не знаю полностью Вашу задачу, но с вероятностью 99.99% он не нужен.

Злой...

 
Igor Makanu:

хм... ну тяп ляп никогда не писал! - это факт!

ЗЫ: топик апаю периодически не от незнания, или не от того,что не способен самостоятельно найти материал, а от того что есть актив, мнение которого мне интересно ;)

ЗЫЗЫ: результат общения -  довольно сильно переосмыслил зачем использовать модификаторы, зачем нужны гет/сет - это экономит время на этапе разработке, при умелом использовании помощи компилятора, тестирование написанного кода будет сразу успешным - тут действительно раскрыли глаза, кто был актив в топике, еще раз благодарю!

Очень хорошо, что Вы чему-то научились. Но Вы можете намного больше продвинуться, если прочитаете C++ Страуструпа.

Статьи на Хабре и разные видео Вам пока лучше не читать и не смотреть. Там пишет кто попало. Они Вас только сбивают с толку.

 

Возник вопрос.


Есть панель с кнопками, на нажатие каждой из кнопок выполняются какие-то функции. Функции вызываемые при нажатии одной из кнопок, назовем ее Exit1,  нужно вынести в отдельный класс CExit1.

Но эти функции используют некоторые глобальные переменные и методы других объектов.

Я в больших проектах не участвовал. Хотел узнать мнение специалистов, как правильно это делать?

Часто программирую таким образом, что если файл mq4 скомпилировать, все классы и include-файлы подтягиваются без ошибок и советник работает как надо. Но если отдельно класс скомпилировать, то бывают предупреждения из-за того что ему не видно некоторые внешние переменные и функции.

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

Поделитесь, как Вы пишите и реализуете работу со своими объектами.

 
Vasiliy Pushkaryov:

Возник вопрос.


Есть панель с кнопками, на нажатие каждой из кнопок выполняются какие-то функции. Функции вызываемые при нажатии одной из кнопок, назовем ее Exit1,  нужно вынести в отдельный класс CExit1.

Но эти функции используют некоторые глобальные переменные и методы других объектов.

Я в больших проектах не участвовал. Хотел узнать мнение специалистов, как правильно это делать?

Часто программирую таким образом, что если файл mq4 скомпилировать, все классы и include-файлы подтягиваются без ошибок и советник работает как надо. Но если отдельно класс скомпилировать, то бывают предупреждения из-за того что ему не видно некоторые внешние переменные и функции.

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

Поделитесь, как Вы пишите и реализуете работу со своими объектами.

Глобальные переменные и стейты кроме присущих платформе - злое зло. И все сущности (группы классов) должны изолироваться и общаться друг с другом в соответствии с протоколом (тот который Interface) и никак иначе.

Это конечно в идеале :-) В реальной жизни решение и поддержку осуществляете сами, потому что ваш проект,задумку и стиль работы не знает никто кроме. 

 
struct A
{
   int x,y;
};

//+------------------------------------------------------------------+
void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   //b = c = a;  //'operator=' - parameter passed as reference, variable expected
}

1. почему не компилируется?

2. есть ли хак, чтобы описать operator= , и в нем использовать родной оператор копирования? .... т.е. некий способ вызвать  ::=

 
Igor Makanu:

1. почему не компилируется?
2. есть ли хак, чтобы описать operator= , и в нем использовать родной оператор копирования? .... т.е. некий способ вызвать  ::=

1) дефолтный оператор присвоения в MQL возвращает тип данных void;
2) можно как-то так:

struct A{
   int x,y;
   
   A(){}
   A(const A &a){
      this.x = a.x;
      this.y = a.y;
   }
   A operator=(const A &a){
      this.x = a.x;
      this.y = a.y;
      return a;
   }
};

void OnStart(){
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;  
}
 
Sergey Dzyublik:

1) дефолтный оператор присвоения в MQL возвращает тип данных void;

не согласен:

struct A
{
   int x[];
};
//+------------------------------------------------------------------+
A myfunc(const int size)
{
   A result;
   ArrayResize(result.x, size);
   for(int i = 0; i < size; i++) result.x[i] = i + 1;
   return(result);
}
//+------------------------------------------------------------------+
void OnStart()
{
   A a;
   a = myfunc(5);
   A b;
   b = a;            // скопировали
   b.x[0] = 99;      // изменили 1-й элемент, чтобы убедиться, что это копия а, а не ссылка как в C#
   ArrayPrint(a.x);
   ArrayPrint(b.x);
}
//+------------------------------------------------------------------+

2020.04.18 18:54:03.855 tst (EURUSD,H1) 1 2 3 4 5

2020.04.18 18:54:03.855 tst (EURUSD,H1) 99  2  3  4  5


однозначно дефолтный оператор присваивания возвращает полный тип данных и совершает копирование, или о каком void идет речь?


2. пример хороший, но хочу сохранить возможность копирования в структурах массивов по дефолтному оператору копирования - проверял, в целом работает довольно не плохо с динамическими массивами, есть пару нюансов, но вопрос пока в другом

 
Igor Makanu:

однозначно дефолтный оператор присваивания возвращает полный тип данных и совершает копирование, или о каком void идет речь?

Ошибаетесь.

Просто определите свой operator=, который возвращает this, и увидите разницу.

Увидеть это можно когда результат присваивания присваивается ещё раз.

struct A
{
   int x;
   int y;
   
   A operator=( const A& a )
   {
      x = a.x;
      y = a.y;
      
      return this;
   }
};

void OnStart()
{
   A a,b,c;
   a.x = 1;
   a.y = 2;
   b = a;
   c = a;
   b = c = a;
}