Ошибки, баги, вопросы - страница 759

 
WWer:

То есть так и должно быть что роль копирующего конструктора выполняет перегруженный оператор присваивания?

Не знаю что есть правильно, но в VS роль копирующего конструктора не выполняет оператор присваивания.
class tt
{
public:
        int f;
        tt(tt& u) {f = 1;}                // Копирующий конструктор, при выполнении его f == 1
        tt(){}
        void operator=(tt &u){f = 100;}   // При выполнении f == 100
};

tt fn()
{
        tt q3;
        return(q3);
}

int _tmain(int argc, _TCHAR* argv[])
{
        tt q2 = fn();
        std::cout<<q2.f;
        char input[54];
        std::cin>>input;
        return 0;
}

На экран выодится 1, т.е. выполняется копирующий конструктор.

Я думаю что вот это: "2) раскомментировать стоку с перегруженным оператором присваивания" по идеи помогать не должно.

 
220Volt:
Не знаю что есть правильно, но в VS роль копирующего конструктора не выполняет оператор присваивания.

На экран выодится 1, т.е. выполняется копирующий конструктор.

Я думаю что вот это: "2) раскомментировать стоку с перегруженным оператором присваивания" по идеи помогать не должно.

Копирующий конструктор выполняется тут

tt q2 = fn();
а не внутри функции fn().
 
mql5:

Копирующий конструктор выполняется тут

а не внутри функции fn().

В таком варианте:

class tt
{
public:
        int f;
        tt(tt& u) {f = 1;}
        tt(){f = 198;}
        void operator=(tt &u){f = 100; std::cout<<"Выполнился присваивающий конструктор";}
};

tt fn()
{
        tt q3;
        return(q3);
}

int _tmain(int argc, _TCHAR* argv[])
{
        tt q2 = fn();
        std::cout<<q2.f;
        char input[54];
        std::cin>>input;
        return 0;
}
Не выводится строка "Выполнился присваивающий конструктор".
 

А так вывелся:

tt q2;
q2 = fn();
WWer, если по аналогии с VS, то нужно смотреть на конкретную ситуацию, приведите конкретный пример копирования/присваивания. Что будет выполнено решается на месте.
 
WWer:

А зачем ее инициализировать? Это же экземпляр класса у которого есть конструктор как раз для этого.

Ага, действительно, пардон.


 И как же тогда правильно написать копирующий конструктор для этой цели?

У вас вполне правильно написан.  Ошибка в функции getCopy(), пытающейся вернуть объект. После переопределения присваивания она уже возвращает указатель, ошибка испаряется.

--

Непонятка здесь может быть вызвана тем, что в языке есть некоторый "синтаксический люфт", связанный с одинаковым представлением синтаксиса обращения в полям статического объекта и динамического (через точку, а не стрелку.  что, кстати, реально удобно). Это входит в привычку и может несколько притуплять чёткость различения объектов и указателей на объекты.  Что в свою очередь может создавать ряд иллюзий, в частности,  будто бы статической (или автоматической) объектной переменной может быть что-то присвоено. Отнюдь, объектная переменная слева от присваивания - всегда указатель, если не определён копирующий конструктор.

 
К сожалению, в этом месте имеется отличие MQL5 от С++.

С++ конструирует объект q2 внутри функции fn() в return, поэтому и отрабатывает конструктор копий.

В MQL5 объект конструируется снаружи, поэтому есть различия. Устраним.


Для интересующихся: называется это Return value optimization

 

Коллеги, доброго времени суток!

Подскажите, как мне получить значения цен по разным фин. инструментам синхронизировано? Я имею в виду, например, цены закрытия баров в определенный момент времени в прошлом на разных инструментах. Воспользоваться функцией CopyClose и получать значения по индексу баров не совсем корректно, поскольку на разных инструментах могут быть пропущенные бары. Насколько я помню, в mql4 была функция BarShift по времени, есть ли аналог на mql5?

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyClose - Документация по MQL5
 

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

Обращение по начальной дате и количеству требуемых элементов

int  CopyClose(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   datetime         start_time,        // с какой даты
   int              count,             // сколько копируем
   double           close_array[]      // массив для копирования цен закрытия
   );

 
Karlson:

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

Обращение по начальной дате и количеству требуемых элементов

int  CopyClose(
   string           symbol_name,       // имя символа
   ENUM_TIMEFRAMES  timeframe,         // период
   datetime         start_time,        // с какой даты
   int              count,             // сколько копируем
   double           close_array[]      // массив для копирования цен закрытия
   );

 

Допустим, я хочу найти отношение значений close[i] EUR/USD и close[i] GBP/USD, но если обращаться по индексу i, то все-равно бары могут быть разные по времени, поскольку существуют пропущенные бары. 

То есть, мне в цикле для каждого бара использовать CopyClose(Symbol, 0, date_of_current_bar, 1, array) ? 

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyClose
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyClose - Документация по MQL5
 

Мне кажется,что бары старших ТФ редко "пропадают".А так да..От указываемой даты получить один бар.Точнее клозе с него.

Другой вариант одновременно получать время этого бара через CopyTime().И сравнивать,чтобы были синхронны.

И третий вариант (наверное облегчающий) сразу использовать CopyRates в структуру. 

Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
Документация по MQL5: Доступ к таймсериям и индикаторам / CopyRates
  • www.mql5.com
Доступ к таймсериям и индикаторам / CopyRates - Документация по MQL5
Причина обращения: