Ошибки, баги, вопросы - страница 1856 1...184918501851185218531854185518561857185818591860186118621863...3776 Новый комментарий [Удален] 2017.04.16 16:02 #18551 fxsaber: Небольшой лайфхак. Обход оператора присваиванияРезультатЭто не лайфхак, а извращение.От Вас такого не ожидал. fxsaber 2017.04.16 16:14 #18552 Koldun Zloy: Это не лайфхак, а извращение.От Вас такого не ожидал.Тогда это для Вас Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий Библиотеки: TypeToBytes fxsaber, 2017.04.13 13:34 Пример того, как данная возможность может быть полезна для выявления потенциальных ошибок.Пишем и запускаем скрипт.#include <TypeToBytes.mqh> struct STRUCT { int i; STRUCT() : i(0) {} template <typename T> void operator =( T& ) {} }; #define PRINT(A) ::Print(#A + " = " + (string)(A)); void OnStart() { PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) }Результат._WRONG_ASSIGN_OPERATOR(STRUCT) = trueЭто говорит о том, что оператор присваивания не будет копировать структуру в структуру этого же типа.Если в структуру добавить еще, void operator =( STRUCT &Value ) { this.i = 0; }то результат будет тот же.Казалось бы, исправив этот оператор на void operator =( STRUCT &Value ) { this.i = Value.i; }должно все стать корректным, но библиотека говорит об обратном.Пожалуй, здесь самый тонкий момент данного примера.Исправляем на#include <TypeToBytes.mqh> struct STRUCT { int i; STRUCT() : i(0) {} template <typename T> void operator =( T& ) {} void operator =( const STRUCT &Value ) { this.i = Value.i; } }; #define PRINT(A) ::Print(#A + " = " + (string)(A)); void OnStart() { PRINT(_WRONG_ASSIGN_OPERATOR(STRUCT)) }и получаем результат_WRONG_ASSIGN_OPERATOR(STRUCT) = falseВот теперь оператор копирования написан корректно!Подобным образом можно проверять корректность операторов присваивания/копирования любых простых структур. Библиотеки: TypeToBytes Особенности языка mql5, тонкости Передача данных. [Удален] 2017.04.16 16:59 #18553 1. Когда мы пишем так:STRUCT StructCopy1 = Struct; должен вызываться не operator=, а конструктор копирования.Хотя, это больше вопрос к Метаквотам.2. Если уж, не вызывается конструктор копирования, созданный компилятором, то мы можем его сами написать.struct STRUCT { int i; STRUCT(){} STRUCT( int _i ) : i(_i){} STRUCT( const STRUCT& other ) { i = other.i; } void operator =( const STRUCT& ) { this.i = 5; } }; Теперь operator= не вызывается.3. Поскольку члены структуры нам доступны, мы просто можем написать так:StructCopy1.i = Struct.i; Если же Вы сделаете их приватными, то и Ваш лайфхак не поможет.4. И самое главное: operator= делают для того, чтобы всё присваивание шло через него, а не в обход.Обычно вместе с ним определяют и конструктор копирования.Да. Пример помотрел. Не увидел большой пользы. Интересное и Юмор Возможно ли реализовать паттерн Разговоры на завалинке о fxsaber 2017.04.16 17:32 #18554 Koldun Zloy: 1. Когда мы пишем так:должен вызываться не operator=, а конструктор копирования.Хотя, это больше вопрос к Метаквотам.2. Если уж, не вызывается конструктор копирования, созданный компилятором, то мы можем его сами написать.Теперь operator= не вызывается.3. Поскольку члены структуры нам доступны, мы просто можем написать так:Если же Вы сделаете их приватными, то и Ваш лайфхак не поможет.4. И самое главное: operator= делают для того, чтобы всё присваивание шло через него, а не в обход.Обычно вместе с ним определяют и конструктор копирования.Да. Пример помотрел. Не увидел большой пользы.Лайфхак обходит и конструктор копирования. А польза здесь#include <TypeToBytes.mqh> struct STRUCT { int i; STRUCT(){} STRUCT( int _i ) : i(_i){} STRUCT( const STRUCT& other ) { i = 2; } void operator =( const STRUCT& ) { // Print(__FUNCSIG__); this.i = 5; } }; void OnStart() { STRUCT Struct(1); ArrayPrint(_R(Struct).Bytes); // 1 0 0 0 STRUCT StructCopy1 = Struct; // STRUCT( const STRUCT& ) ArrayPrint(_R(StructCopy1).Bytes); // 2 0 0 0 StructCopy1 = Struct; // void STRUCT::operator=( const STRUCT& ) ArrayPrint(_R(StructCopy1).Bytes); // 5 0 0 0 }_R - универсальная штука. Поэтому чужие структуры со своими операторами переопределять не требуется.#include <TypeToBytes.mqh> struct STRUCT { int i; void operator =( const STRUCT& ) { this.i = 5; } }; void OnStart() { STRUCT Structs[] = {{1}, {2}}; ArrayPrint(_R(Structs).Bytes); // 1 0 0 0 2 0 0 0 } Andrey Khatimlianskii 2017.04.16 21:10 #18555 Andrey Dik: Да, Акепадом вижу, что кодировка Win-1251 (ANSI), а у более старых файлов UTF-16LE 1200.Так значит всё таки изменилась кодировка по умолчанию для новых файлов?Нет, всегда была Win-1251 (ANSI), а в какой-то момент добавилась UTF. Но только для тех исходников, которые содержат не-анси символы. Andrey Dik 2017.04.16 21:19 #18556 Andrey Khatimlianskii: Нет, всегда была Win-1251 (ANSI), а в какой-то момент добавилась UTF. Но только для тех исходников, которые содержат не-анси символы.Понятно. Спасибо. Konstantin 2017.04.17 07:26 #18557 А как перегрузить операторы [] и =, что бы можно было писать так:class A { private: int arr[5]; }; A *obj = new A(); for(int i = 0; i < 5; ++i) obj[i] = i; fxsaber 2017.04.17 07:36 #18558 Konstantin: А как перегрузить операторы [] и =, что бы можно было писать так:class A { int arr[5]; int CurrentPos; public: A* operator []( const int Pos ) { this.CurrentPos = Pos; return(&this); } void operator =( const int Value ) { this.arr[this.CurrentPos] = Value; } }; Konstantin 2017.04.17 07:45 #18559 fxsaber: спасибо, а как перегрузить еще раз оператор [] что бы можно было писать в дополнение к вышенаписанному еще так:class A { int arr[5]; int CurrentPos; public: A* operator []( const int Pos ) { this.CurrentPos = Pos; return(&this); } void operator =( const int Value ) { this.arr[this.CurrentPos] = Value; } }; for(int i = 0; i < 5; ++i) int _value = obj[i]; fxsaber 2017.04.17 08:19 #18560 Konstantin:спасибо, а как перегрузить еще раз оператор [] что бы можно было писать в дополнение к вышенаписанному еще так:class A { int arr[5]; int CurrentPos; public: A* operator []( const int Pos ) { this.CurrentPos = Pos; return(&this); } void operator =( const int Value ) { this.arr[this.CurrentPos] = Value; } int operator []( const uint Pos ) const { return(this.arr[Pos]); } }; void OnStart() { A obj; for (int i = 0; i < 5; ++i) obj[i] = i; for (uint i = 0; i < 5; ++i) int _value = obj[i]; } 1...184918501851185218531854185518561857185818591860186118621863...3776 Новый комментарий
Небольшой лайфхак. Обход оператора присваивания
Результат
Это не лайфхак, а извращение.
От Вас такого не ожидал.
Это не лайфхак, а извращение.
От Вас такого не ожидал.
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Библиотеки: TypeToBytes
fxsaber, 2017.04.13 13:34
Пример того, как данная возможность может быть полезна для выявления потенциальных ошибок.
Пишем и запускаем скрипт.
Результат.
_WRONG_ASSIGN_OPERATOR(STRUCT) = trueЭто говорит о том, что оператор присваивания не будет копировать структуру в структуру этого же типа.
Если в структуру добавить еще,
то результат будет тот же.
Казалось бы, исправив этот оператор на
должно все стать корректным, но библиотека говорит об обратном.
Пожалуй, здесь самый тонкий момент данного примера.
Исправляем на
и получаем результат
_WRONG_ASSIGN_OPERATOR(STRUCT) = falseВот теперь оператор копирования написан корректно!
Подобным образом можно проверять корректность операторов присваивания/копирования любых простых структур.
1. Когда мы пишем так:
должен вызываться не operator=, а конструктор копирования.Хотя, это больше вопрос к Метаквотам.
2. Если уж, не вызывается конструктор копирования, созданный компилятором, то мы можем его сами написать.
Теперь operator= не вызывается.
3. Поскольку члены структуры нам доступны, мы просто можем написать так:
Если же Вы сделаете их приватными, то и Ваш лайфхак не поможет.
4. И самое главное: operator= делают для того, чтобы всё присваивание шло через него, а не в обход.
Обычно вместе с ним определяют и конструктор копирования.
Да. Пример помотрел. Не увидел большой пользы.
1. Когда мы пишем так:
должен вызываться не operator=, а конструктор копирования.Хотя, это больше вопрос к Метаквотам.
2. Если уж, не вызывается конструктор копирования, созданный компилятором, то мы можем его сами написать.
Теперь operator= не вызывается.
3. Поскольку члены структуры нам доступны, мы просто можем написать так:
Если же Вы сделаете их приватными, то и Ваш лайфхак не поможет.
4. И самое главное: operator= делают для того, чтобы всё присваивание шло через него, а не в обход.
Обычно вместе с ним определяют и конструктор копирования.
Да. Пример помотрел. Не увидел большой пользы.
_R - универсальная штука. Поэтому чужие структуры со своими операторами переопределять не требуется.
Да, Акепадом вижу, что кодировка Win-1251 (ANSI), а у более старых файлов UTF-16LE 1200.
Так значит всё таки изменилась кодировка по умолчанию для новых файлов?
Нет, всегда была Win-1251 (ANSI), а в какой-то момент добавилась UTF. Но только для тех исходников, которые содержат не-анси символы.
А как перегрузить операторы [] и =, что бы можно было писать так:
class A { private: int arr[5]; };A *obj = new A();
for(int i = 0; i < 5; ++i) obj[i] = i;
А как перегрузить операторы [] и =, что бы можно было писать так:
спасибо, а как перегрузить еще раз оператор [] что бы можно было писать в дополнение к вышенаписанному еще так:
спасибо, а как перегрузить еще раз оператор [] что бы можно было писать в дополнение к вышенаписанному еще так: