Особенности языка mql5, тонкости и приёмы работы - страница 283

 
fxsaber #:

Не понял.

https://www.mql5.com/ru/forum/1111/page3600#comment_55388475

Неявный - тот, который вы не объявляли, а компилятор сам сгенерировал его для вас. MQL компилятор так не умеет.

https://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D0%BE%D1%80_%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F

Обычно компилятор автоматически создает конструктор копирования для каждого класса (известные как неявные конструкторы копирования, то есть конструкторы копирования, заданные неявным образом), но в некоторых случаях программист создает конструктор копирования, называемый в таком случае явным конструктором копирования (или «конструктором копирования, заданным явным образом»). В подобных случаях компилятор не создает неявные конструкторы.

Следующие примеры иллюстрируют работу конструкторов копирования и их необходимость.

#include <iostream>

class Person
{
    public:
        int age;
        Person(int age) : age(age) {}
};

int main()
{
    Person timmy(10);
    Person sally(15);

    Person timmy_clone = timmy;
 
    std::cout << timmy.age << " " << sally.age << " " << timmy_clone.age << std::endl;
 
    timmy.age = 23;
 
    std::cout << timmy.age << " " << sally.age << " " << timmy_clone.age << std::endl;
}

Как и ожидалось, timmy скопировался в новый объект timmy_clone. При изменении возраста (age) timmy, у timmy_clone возраст не менялся: объекты полностью независимы.

Компилятор сгенерировал для нас конструктор копирования, который может быть записан примерно так:

Person(Person const& copy)
  : age(copy.age) {}

 
Vladislav Boyko #:

https://www.mql5.com/ru/forum/1111/page3600#comment_55388475

Неявный - тот, который вы не объявляли, а компилятор сам сгенерировал его для вас. MQL компилятор так не умеет.

Сложности только при const-полях?

 
fxsaber #:

Сложности только при const-полях?

Да, недостаток operator= заключается в том, что вы не можете использовать его для const полей (лично у меня больше половины объектов содержат const поля). А конструктор копирования придется объявлять самостоятельно (в отличии от operator=).

 
Как узнать, что окно графика находится в фокусе, а не открыто другое окно с другим графиком?
 
Andrei Iakovlev #:
Как узнать, что окно графика находится в фокусе, а не открыто другое окно с другим графиком?

ответ:

bool IsChartFocused()
  {
        return(bool(ChartGetInteger(0,CHART_BRING_TO_TOP)));
  }
 

Благодаря этой фишке можно писать такие конструкции.

#define MACROS(T, A, B, C, D)                                                                          \
  for (T A = (B); (T)NormalizeDouble(A, 8) <= (T)NormalizeDouble(C, 8); A += D)                        \
  {                                                                                                    \
    string Str = ((Amount == 1) ? NULL : (Str + ", ")) + #A + " = " + (string)(T)DoubleToString(A, 1); \                                                                                                                                                                                                                   \ 
    int Amount = Amount * (int)((C - (B)) / (D) + 1.1);                         

void OnStart()
{
  string Str;
  int Amount = 1;
  int Count = 0;
    
  MACROS(int, Value1, 10, 20, 5)
    MACROS(double, Value2, 0.2, 0.3, 0.1)
      MACROS(int, Value3, 17, 21, 2)
        Print((string)++Count + " / " + (string)Amount + ": " + Str);
      }
    }
  }
}


Результат.

1 / 18: Value1 = 10, Value2 = 0.2, Value3 = 17
2 / 18: Value1 = 10, Value2 = 0.2, Value3 = 19
3 / 18: Value1 = 10, Value2 = 0.2, Value3 = 21
4 / 18: Value1 = 10, Value2 = 0.3, Value3 = 17
5 / 18: Value1 = 10, Value2 = 0.3, Value3 = 19
6 / 18: Value1 = 10, Value2 = 0.3, Value3 = 21
7 / 18: Value1 = 15, Value2 = 0.2, Value3 = 17
8 / 18: Value1 = 15, Value2 = 0.2, Value3 = 19
9 / 18: Value1 = 15, Value2 = 0.2, Value3 = 21
10 / 18: Value1 = 15, Value2 = 0.3, Value3 = 17
11 / 18: Value1 = 15, Value2 = 0.3, Value3 = 19
12 / 18: Value1 = 15, Value2 = 0.3, Value3 = 21
13 / 18: Value1 = 20, Value2 = 0.2, Value3 = 17
14 / 18: Value1 = 20, Value2 = 0.2, Value3 = 19
15 / 18: Value1 = 20, Value2 = 0.2, Value3 = 21
16 / 18: Value1 = 20, Value2 = 0.3, Value3 = 17
17 / 18: Value1 = 20, Value2 = 0.3, Value3 = 19
18 / 18: Value1 = 20, Value2 = 0.3, Value3 = 21
 
fxsaber #:

Благодаря этому чипу можно писать такие конструкции.


Результат.

Почему вам нужны "Макросы" и вы не можете использовать стандартный MQL с шаблонами и указателями функций?

Что вам дают макросы?

 
Alain Verleyen #:

Почему вам нужны "Макросы" и вы не можете использовать стандартный MQL с шаблонами и указателями функций?

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

Что вам дают макросы?

Мой код в кодобазе редко обходится без макросов. В большинстве случаев это безальтернативная необходимость.

 
fxsaber #:

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

Мой код в кодобазе редко обходится без макросов. В большинстве случаев это безальтернативная необходимость.

И всё же вопрос без ответа.

Понятно, когда речь про совместимость кода для двух терминалов, но в других случаях - в чём смысл?

 
Aleksey Vyazmikin #:

Понятно, когда речь про совместимость кода для двух терминалов, но в других случаях - в чём смысл?

Чтобы конструктивно обсуждать, нужно пример непонятного привести. Вот выше применил.


Мне нужно было перебрать комбинации входных параметров ТС для Тестера. И для каждой комбинации запустить оптимизацию.

Поэтому необходимо было сделать несколько вложенных for-циклов. Ну а для того, чтобы видеть номер варианта и комбинацию текущих входных, идет распечатка.


Соответственно, сделал через макрос. Чтобы удобно (одной строкой) задавать изменение одного из параметров ТС в наборе.


Вроде, оптимально получилось.  Ведь другими инструментами лучше не решить задачу.

Сайт использует cookie-файлы. Узнайте больше о нашей политике по использованию cookie-файлов.