Сообщение Re: Оператор присваивания и data members производных типов от 06.10.2018 7:13
Изменено 06.10.2018 7:19 rg45
Re: Оператор присваивания и data members производных типов
Здравствуйте, Максим Рогожин, Вы писали:
МР>Если у нас есть класс:
МР>
МР>то оператор присваивания для такого класса невозможно написать, так как не известно какого типа y_ (базового или производного), так? Нужно требовать от Y чтобы он поддерживал какой-нибудь интерфейс class Clonable { public: Y* clone(); }, так?
Смотря о каком операторе присваивания мы говорим. Перемещающий оператор присваивания пишется здесь просто "в лоб". Для копирующего оператора присваивания достаточно, чтоб Y был либо copy-assignable, либо copy-constructible, тут мы должны уже понимать, что именно мы хотим от нашего оператора присваиваня. Интерфейс клонирования нужен только в том случае, если Y — это полиморфный класс и статический тип объекта нам неизвестен.
МР>Если у нас есть класс:
МР>
МР>class X {
МР> std::unique_ptr<Y> y_;
МР>public:
МР> void setY(std::unique_ptr<Y> y);
МР>};
МР>
МР>то оператор присваивания для такого класса невозможно написать, так как не известно какого типа y_ (базового или производного), так? Нужно требовать от Y чтобы он поддерживал какой-нибудь интерфейс class Clonable { public: Y* clone(); }, так?
Смотря о каком операторе присваивания мы говорим. Перемещающий оператор присваивания пишется здесь просто "в лоб". Для копирующего оператора присваивания достаточно, чтоб Y был либо copy-assignable, либо copy-constructible, тут мы должны уже понимать, что именно мы хотим от нашего оператора присваиваня. Интерфейс клонирования нужен только в том случае, если Y — это полиморфный класс и статический тип объекта нам неизвестен.
Re: Оператор присваивания и data members производных типов
Здравствуйте, Максим Рогожин, Вы писали:
МР>Если у нас есть класс:
МР>
МР>то оператор присваивания для такого класса невозможно написать, так как не известно какого типа y_ (базового или производного), так? Нужно требовать от Y чтобы он поддерживал какой-нибудь интерфейс class Clonable { public: Y* clone(); }, так?
Смотря о каком операторе присваивания мы говорим. Перемещающий оператор присваивания пишется здесь просто "в лоб". Для копирующего оператора присваивания, в том случае, если Y — неполиморфный тип, достаточно, чтоб Y был либо copy-assignable, либо copy-constructible, тут мы должны уже понимать, что именно мы хотим от нашего оператора присваиваня. Интерфейс клонирования нужен только в том случае, если Y — это полиморфный класс и статический тип объекта нам неизвестен.
МР>Если у нас есть класс:
МР>
МР>class X {
МР> std::unique_ptr<Y> y_;
МР>public:
МР> void setY(std::unique_ptr<Y> y);
МР>};
МР>
МР>то оператор присваивания для такого класса невозможно написать, так как не известно какого типа y_ (базового или производного), так? Нужно требовать от Y чтобы он поддерживал какой-нибудь интерфейс class Clonable { public: Y* clone(); }, так?
Смотря о каком операторе присваивания мы говорим. Перемещающий оператор присваивания пишется здесь просто "в лоб". Для копирующего оператора присваивания, в том случае, если Y — неполиморфный тип, достаточно, чтоб Y был либо copy-assignable, либо copy-constructible, тут мы должны уже понимать, что именно мы хотим от нашего оператора присваиваня. Интерфейс клонирования нужен только в том случае, если Y — это полиморфный класс и статический тип объекта нам неизвестен.