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

 
pavlick_:

О, оказывается в мкл имеется автогенерация конструктора копирования (я думал, что его вообще нет, т.к. нельзя Class obj(other_obj), только через =). Но почему он не генерится если:

default и delete не поддерживаются

Конструктор копирования по умолчанию, оказывается пока сделали.

Только оператор копирования, т.е. для конструкций:

CFoo foo=another_foo;

Сначала вызывается конструктор CFoo по умолчанию, а затем оператор копирования

 
Ilyas:

вызывается оператор копирования, а не конструктор копирования.

Но это всё равно ошибка, т.к. неявный оператор копирования должен создаваться только класса B, а не для всех родительских классов.  Т.е. объект не должен позволять частично заменять свои внутренности.
 
Ilyas:

default и delete не поддерживаются

Это да, но отменять генерацию копирующего конструктора нужно лишь в случае, когда есть пользовательский копирующий конструктор, разве нет? А не любой пользовательский.

 
Alexey Navoykov:
Т.е. объект не должен позволять частично заменять свои внутренности.

Это какое-то искусственное самоограничение... я бы даже сказал - узость мышления

class A {};
class B : public A {
public:
        void operator =( const A& ) {}
};

В чем проблема?

Нашёл у себя такую конструкцию... и все работает... нормально. По сему предлагаю Разработчикам оставить все как есть... по крайней мере если соответствующие операторы\конструкторы определены явно

 
A100:

Это какое-то искусственное самоограничение... я бы даже сказал - узость мышления

В чем проблема?

Нашёл у себя такую конструкцию... и все работает... нормально. По сему предлагаю Разработчикам оставить все как есть... по крайней мере если соответствующие операторы определены явно

Проверьте для начала, как в C++ всё работает. Видимо его правила придумывали "узкомыслящие".

А городить каждый раз затычки, чтобы защититься от неправильной архитектуры языка... Нет уж, надо изначально делать по уму.  Имею ввиду язык

 
Alexey Navoykov:

Проверьте для начала, как в C++ всё работает. Видимо его правила придумывали "узкомыслящие".

А городить каждый раз затычки, чтобы защититься от неправильной архитектуры языка... Нет уж, надо изначально делать по уму.  Имею ввиду язык

Специально для Вас перепроверил с учетом https://www.mql5.com/ru/forum/1111/page2358#comment_10003995

#ifdef __cplusplus
#include "https://www.mql5.com/ru/forum/1111/page2358#comment_10003995"
void OnStart()
{
        A a;
        B b;
        b = a;
}
#endif

Все нормально DJ

Ошибки, баги, вопросы
Ошибки, баги, вопросы
  • 2018.12.24
  • www.mql5.com
Общее обсуждение: Ошибки, баги, вопросы
 
A100:

Специально для Вас перепроверил с учётом

Все нормально 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 мой пример тоже работает. Я имел ввиду явный оператор копирования и пояснил это кодом.

Написал на всякий случай, чтобы при запрете нервного явное заодно не запретили бы случайно

 
A100:

В Visual Studio мой пример тоже работает. Я имел ввиду явный оператор копирования и пояснил это кодом.

О явном операторе не шла речь.  Я говорил о недопустимости неявного оператора в данном случае, которую вы назвали "узостью мышления", а это не так.

Если требуется провести копирование, то в C++ нужно сначала явно кастить b к нужному типу.   Ибо такое копирование - это нарушение инкапсуляции объекта. Поэтому ни о какой неявности речи быть не должно.

 
A100:

Я имел ввиду явный оператор копирования и пояснил это кодом.

Кстати, если класс A тоже унаследован от какого-то класса X, то ваш класс B никак не защищён от копирования X (говорим о MQL).  Вам придётся прописывать операторы ВСЕХ родительских классов.