Встречайте учебник «Программирование на MQL5 для трейдеров» - страница 5

 
Stanislav Korotky #:

В учебнике говорится о невозможности копирования содержимого структур из разных веток наследования.

Был приведён рабочий пример копирования структур из разных веток, который, по информации из учебника - не работает.

Так понятнее?
 
A100 #:

Для начинающих пользователей - поясню в чем принципиальность ошибки: функция f() скрытно изменила будущую целостность объекта помимо воли его владельца. Проще говоря: на вход объект пришел как const, а на выходе получили как не const

В (2) случае компилятор стоит на страже, и при попытке вызвать g2() выдает ошибку

Во (4) случае появилась неграмотная функция f(), против которой компилятор бессилен и вынужден вызвать g2()

Семантика моего примера подразумевает неизменность параметра внутри функции и класса. Модификатор const подчеркивает этот контракт (дает напоминание для программиста и защиту через компилятор на случай, если метод позднее разрастется и кто-то решит сделать внутри присваивание). Тут нет никаких обязательств по поводу использования переданного объекта вовне.

Любую конструкцию языка можно использовать во благо или во вред, особенно если целенаправленно.

 
Sergey Gridnev #:
Был приведён рабочий пример копирования структур из разных веток, который, по информации из учебника - не работает.

В тексте учебника говорится иное. Вы какую-то отдельную фразу читаете, а не абзац целиком.

В результате операции присваивания m3 = in, поля X и Y (общая часть для обоих типов) скопируются из переменной in базового типа в поля X и Y в переменной m3 производного типа. Поле code переменной m3 останется без изменений.

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

 
Stanislav Korotky #:
Любую конструкцию языка можно использовать во благо или во вред, особенно если целенаправленно
Я соглашусь с A100, нельзя в учебнике приводить настолько небрежные примеры кода.
 
Sergey Gridnev #:
Я соглашусь с A100, нельзя в учебнике приводить настолько небрежные примеры кода.

Как по-вашему изменить конкретно этот метод с учетом его специфики, а не вырванным из контекста?

 
Stanislav Korotky #:

Семантика моего примера подразумевается неизменность параметра внутри функции и класса. Модификатор const подчеркивает этот контракт (дает напоминание для программиста и защиту через компилятор на случай, если метод позднее разрастется и кто-то решит сделать внутри присваивание). Тут нет никаких обязательств по поводу использования переданного объекта вовне.

Любую конструкцию языка можно использовать во благо или во вред, особенно если целенаправленно.

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

Если Вы не в состоянии это сделать, то сделаю это за Вас:

template<typename T>
T *f(       T *n ) { return (T *)n; } //убрали ошибочный const
class A {
public:
    void g2()       { Print("Константность нарушена" ); }
};
void OnStart()
{
    const A *a = new A;//Результат:
       a  .g2(); //(2)//Error: 'g2' - call non-const method for constant object
    f( a ).g2(); //(4)//Error: 'g2' - call non-const method for constant object
    delete a;
}

Теперь компилятор стоит на страже в обоих случаях и выдает ошибку

 

А если, по каким то причинам на входе должен быть обязательно const, то и на выходе пишем const - это азы!

template<typename T>
const T *f( const T *n ) { return (T *)n; } //грамотно сохранили const на входе
 
A100 #:

А если, по каким то причинам на входе должен быть обязательно const, то и на выходе пишем const

Наиболее простой и понятный уход от разыменования указателя. Все остальные примеры - излишнее усложнение.

 

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

Всех уважаю, с наступающим.))))

 
A100 #:

А если, по каким то причинам на входе должен быть обязательно const, то и на выходе пишем const - это азы!

Конечно)))

Причина обращения: