Оператор присваивания и data members производных типов
От: Максим Рогожин Россия  
Дата: 06.10.18 06:44
Оценка:
Привет!

Если у нас есть класс:
class X {
   std::unique_ptr<Y> y_;
public:
   void setY(std::unique_ptr<Y> y);
};


то оператор присваивания для такого класса невозможно написать, так как не известно какого типа y_ (базового или производного), так? Нужно требовать от Y чтобы он поддерживал какой-нибудь интерфейс class Clonable { public: Y* clone(); }, так?
Re: Оператор присваивания и data members производных типов
От: rg45 СССР  
Дата: 06.10.18 07:13
Оценка: 2 (1) +2
Здравствуйте, Максим Рогожин, Вы писали:

МР>Если у нас есть класс:

МР>
МР>class X {
МР>   std::unique_ptr<Y> y_;
МР>public:
МР>   void setY(std::unique_ptr<Y> y);
МР>};
МР>


МР>то оператор присваивания для такого класса невозможно написать, так как не известно какого типа y_ (базового или производного), так? Нужно требовать от Y чтобы он поддерживал какой-нибудь интерфейс class Clonable { public: Y* clone(); }, так?


Смотря о каком операторе присваивания мы говорим. Перемещающий оператор присваивания пишется здесь просто "в лоб", или даже просто объявляется как default. Для копирующего оператора присваивания, в том случае, если Y — неполиморфный тип, достаточно, чтоб Y был либо copy-assignable, либо copy-constructible, тут мы должны уже понимать, что именно мы хотим от нашего оператора присваиваня. Интерфейс клонирования нужен только в том случае, если Y — это полиморфный класс и статический тип объекта нам неизвестен.
--
Отредактировано 06.10.2018 11:09 rg45 . Предыдущая версия . Еще …
Отредактировано 06.10.2018 7:19 rg45 . Предыдущая версия .
Re[2]: Оператор присваивания и data members производных типов
От: Максим Рогожин Россия  
Дата: 08.10.18 17:55
Оценка:
Здравствуйте, rg45, Вы писали:

R>Смотря о каком операторе присваивания мы говорим. Перемещающий оператор присваивания пишется здесь просто "в лоб", или даже просто объявляется как default. Для копирующего оператора присваивания, в том случае, если Y — неполиморфный тип, достаточно, чтоб Y был либо copy-assignable, либо copy-constructible, тут мы должны уже понимать, что именно мы хотим от нашего оператора присваиваня. Интерфейс клонирования нужен только в том случае, если Y — это полиморфный класс и статический тип объекта нам неизвестен.


Спасибо.
Полиморфный тип это термин из стандарта? Я имел ввиду любой тип, у которого виртуальный деструктор имеется.
Re[3]: Оператор присваивания и data members производных тип
От: rg45 СССР  
Дата: 08.10.18 18:35
Оценка: 2 (1)
Здравствуйте, Максим Рогожин, Вы писали:

МР>Полиморфный тип это термин из стандарта? Я имел ввиду любой тип, у которого виртуальный деструктор имеется.


Нет, этот термин не из стандарта, но достаточно распространен в сообществе. Он обозначает класс из какой-либо иерархии, предназначенный для полиморфного использования. Неизменным признаком таких классов является, как ты верно заметил, наличие виртуального деструктора. По этой теме можно посмотреть, например, классификацию типов, данную в книжке Саттера и Александреску C++ Coding Standards, 101 Rules, Guidelines and Best Practices. Рекоммендация #32: "Be clear what kind of class you're writing".
--
Отредактировано 08.10.2018 18:35 rg45 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.