О, оказывается в мкл имеется автогенерация конструктора копирования (я думал, что его вообще нет, т.к. нельзя Class obj(other_obj), только через =). Но почему он не генерится если:
default и delete не поддерживаются
Конструктор копирования по умолчанию, оказывается пока сделали.
Только оператор копирования, т.е. для конструкций:
CFoo foo=another_foo;
Сначала вызывается конструктор CFoo по умолчанию, а затем оператор копирования
вызывается оператор копирования, а не конструктор копирования.
Но это всё равно ошибка, т.к. неявный оператор копирования должен создаваться только класса B, а не для всех родительских классов. Т.е. объект не должен позволять частично заменять свои внутренности.
Это да, но отменять генерацию копирующего конструктора нужно лишь в случае, когда есть пользовательский копирующий конструктор, разве нет? А не любой пользовательский.
Alexey Navoykov: Т.е. объект не должен позволять частично заменять свои внутренности.
Это какое-то искусственное самоограничение... я бы даже сказал - узость мышления
class A {};
class B : public A {
public:
voidoperator =( const A& ) {}
};
В чем проблема?
Нашёл у себя такую конструкцию... и все работает... нормально. По сему предлагаю Разработчикам оставить все как есть... по крайней мере если соответствующие операторы\конструкторы определены явно
Это какое-то искусственное самоограничение... я бы даже сказал - узость мышления
В чем проблема?
Нашёл у себя такую конструкцию... и все работает... нормально. По сему предлагаю Разработчикам оставить все как есть... по крайней мере если соответствующие операторы определены явно
Проверьте для начала, как в C++ всё работает. Видимо его правила придумывали "узкомыслящие".
А городить каждый раз затычки, чтобы защититься от неправильной архитектуры языка... Нет уж, надо изначально делать по уму. Имею ввиду язык
В Visual Studio мой пример тоже работает. Я имел ввиду явный оператор копирования и пояснил это кодом.
О явном операторе не шла речь. Я говорил о недопустимости неявного оператора в данном случае, которую вы назвали "узостью мышления", а это не так.
Если требуется провести копирование, то в C++ нужно сначала явно кастить b к нужному типу. Ибо такое копирование - это нарушение инкапсуляции объекта. Поэтому ни о какой неявности речи быть не должно.
Я имел ввиду явный оператор копирования и пояснил это кодом.
Кстати, если класс A тоже унаследован от какого-то класса X, то ваш класс B никак не защищён от копирования X (говорим о MQL). Вам придётся прописывать операторы ВСЕХ родительских классов.
О, оказывается в мкл имеется автогенерация конструктора копирования (я думал, что его вообще нет, т.к. нельзя Class obj(other_obj), только через =). Но почему он не генерится если:
default и delete не поддерживаются
Конструктор копирования по умолчанию, оказывается пока сделали.
Только оператор копирования, т.е. для конструкций:
Сначала вызывается конструктор CFoo по умолчанию, а затем оператор копирования
вызывается оператор копирования, а не конструктор копирования.
default и delete не поддерживаются
Это да, но отменять генерацию копирующего конструктора нужно лишь в случае, когда есть пользовательский копирующий конструктор, разве нет? А не любой пользовательский.
Т.е. объект не должен позволять частично заменять свои внутренности.
Это какое-то искусственное самоограничение... я бы даже сказал - узость мышления
В чем проблема?
Нашёл у себя такую конструкцию... и все работает... нормально. По сему предлагаю Разработчикам оставить все как есть... по крайней мере если соответствующие операторы\конструкторы определены явно
Это какое-то искусственное самоограничение... я бы даже сказал - узость мышления
В чем проблема?
Нашёл у себя такую конструкцию... и все работает... нормально. По сему предлагаю Разработчикам оставить все как есть... по крайней мере если соответствующие операторы определены явно
Проверьте для начала, как в C++ всё работает. Видимо его правила придумывали "узкомыслящие".
А городить каждый раз затычки, чтобы защититься от неправильной архитектуры языка... Нет уж, надо изначально делать по уму. Имею ввиду язык
Проверьте для начала, как в C++ всё работает. Видимо его правила придумывали "узкомыслящие".
А городить каждый раз затычки, чтобы защититься от неправильной архитектуры языка... Нет уж, надо изначально делать по уму. Имею ввиду язык
Специально для Вас перепроверил с учетом https://www.mql5.com/ru/forum/1111/page2358#comment_10003995
Все нормально DJ
Специально для Вас перепроверил с учётом
Все нормально DJ
Какой компилятор у вас?
У меня на VS 2010:
binary '=' : no operator found which takes a right-hand operand of type 'A' (or there is no acceptable conversion)
p.s. Я только не очень понял, что значит "с учётом"? Речь шла о допустимости неявного копирования базового класса в производный.
В Visual Studio мой пример тоже работает. Я имел ввиду явный оператор копирования и пояснил это кодом.
Написал на всякий случай, чтобы при запрете нервного явное заодно не запретили бы случайно
В Visual Studio мой пример тоже работает. Я имел ввиду явный оператор копирования и пояснил это кодом.
О явном операторе не шла речь. Я говорил о недопустимости неявного оператора в данном случае, которую вы назвали "узостью мышления", а это не так.
Если требуется провести копирование, то в C++ нужно сначала явно кастить b к нужному типу. Ибо такое копирование - это нарушение инкапсуляции объекта. Поэтому ни о какой неявности речи быть не должно.
Я имел ввиду явный оператор копирования и пояснил это кодом.