Ошибки, баги, вопросы - страница 2521
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
fxsaber:
Подскажите, как в C++ с этим? Задумался, использовать эту фишку в своем коде или нет. Если в C++ работает, буду использовать. Нет - вряд ли, т.к. могут отменить в следующих билдах.
b = a; a = b; // OK
Первое присваивание работает только в MQL. И очень плохо, что оно работает. Хотелось бы, чтоб отменили, наконец, это недоразумение. Со вторым - проблем нет.
Первое присваивание работает только в MQL. И очень плохо, что оно работает. Хотелось бы, чтоб отменили, наконец, это недоразумение. Со вторым - проблем нет.
Странно. Я считал, что первое работать обязано, а второе - нет.
Странно. Я считал, что первое работать обязано, а второе - нет.
Ну вот видимо и разработчики MQL тоже не совсем понимают суть присваивания. Ибо я им талдычу об этой проблеме уже давно, но как об стену горох.
Суть присваивания в том, что объекту присваивается эквивалентный объект. Т.е. того же типа. Это значит, что правый объект сначала неявно кастится к типу левого объекта, а потом уже происходит присваивание (копирование). И в первом случае естественно такой кастинг (A->B) невозможен. В C++ будет ошибка. А в MQL вместо этого левый объект кастится к правому и выполняется A::operator=(A&), замещая лишь часть объекта b. Разве это присваивание?
Представьте, что вы лонгу присваиваете инт, но происходит только замещение первых четырёх байт, а остальная часть остаётся нетронутой. Вот здесь то же самое.
Представьте, что вы лонгу присваиваете инт, но происходит только замещение первых четырёх байт, а остальная часть остаётся нетронутой. Вот здесь то же самое.
Так это удобно, вроде. В контексте структур, конечно.
Так это удобно, вроде. В контексте структур, конечно.
Да сомнительное удобство. Может оно и экономит символы в строке, но является источником случайных ошибок и затрудняет/искажает понимание кода. Как уже сказано выше, знак равенства имеет чёткий и однозначный смысл, что объект меняется целиком. Поэтому в данном случае оператор используется не по назначению. Если хочется такого нестандартного поведения, то следует перегрузить оператор для таких целей.
p.s. Допускаю лишь исключение, если класс B не имеет собственных полей, т.е. полностью совпадает с классом A (полностью эквивалентен ему), тогда нет причин препятствовать такому присвоению. Хотя в C++ оно всё-равно не работает, но в MQL можно разрешить.
В opt-файле в куске, где прописаны все входные параметры, значение для оптимизируемых параметров (определяется через поля size и offset) содержит не Value (как без оптимизации), а Start.
Логично, если там будет Value.
Ну вот видимо и разработчики MQL тоже не совсем понимают суть присваивания. Ибо я им талдычу об этой проблеме уже давно, но как об стену горох.
Суть присваивания в том, что объекту присваивается эквивалентный объект. Т.е. того же типа.
Суть операций для пользовательских типов заранее не определена. А определен лишь их порядок, который в данном случае заключается в вызове подходящего operator=
В MQL в отличие от С++ operator= наследуется, поэтому b = a; эквивалентно вызову А::operator=(const A&);
В общем случае здесь нет противоречий. В частном случае присваивания эквивалентного объекта есть некая нестыковка сущностей, но не более того
В MQL в отличие от С++ operator= наследуется, поэтому b = a; эквивалентно вызову b.operator=(const A&);
Ну да, в этом и проблема. Но разница в написании тут роли не играет. В С++ не скомпилируется в обоих случаях.
В общем случае здесь нет противоречий. В частном случае присваивания эквивалентного объекта есть некая нестыковка сущностей
Противоречие будет хотя бы с С++. Если такое компилируется, значит правый операнд неявно кастится к левому, и затем происходит полное замещение объекта. Как оно и должно работать по логике. Пример с int->long я приводил. А замещение части внутренностей объекта не есть присваивание. Поэтому тут всё в одном: и противоречие, и нестыковка.
p.s. Хотя ещё может быть перегружен оператор B::operator=(A&) , но я полагаю, здравомыслящий программист там тоже полностью заменит объект B, а не частично. Ибо в этом суть присваивания.
Если кому хочется лаконичного написания, то можно было бы сделать для этого какой-то другой оператор: &= или |= например . Они по крайней мере не являются общеупотребительными, поэтому не перепутаешь.
..........
Противоречие будет хотя бы с С++. ......
..........
С чего Вы взяли, что MQL должна полностью соответствовать С++ ???
С-подобный - вовсе не означает эквивалентный!
MQL разработан для вполне определённых задач и вовсе не обязан полностью копировать язык, на основе которого был создан.
Может уже хватит возмущаться?
А вот в Паскале можно .........
А в Ассемблере так .....
А на ява ....
А на Бэйсик ....
Вы что, в сравнение языков тут практикуетесь?
=======
П.С. Это я не только Вам...
С чего Вы взяли, что MQL должна полностью соответствовать С++ ???
...
Вы что, в сравнение языков тут практикуетесь?
Я отвечал на конкретную фразу. Успокойтесь. Выпейте валерьянки и ложитесь спать, вам вредно волноваться. ...Эк же у некоторых тут подгорает при слове "C++" )