2016-06-17 3 views
1

Я хочу реализовать конструктор копирования в следующем классе A, который содержит указатель на полиморфный класс реализации Base. В настоящее время у меня есть виртуальный метод create_copy() в классе Base, который необходимо переопределить производным классам. Тем не менее, переопределения для производных классов используют один и тот же код. Я пропустил более простой способ копирования объектов типа A? И действительно ли мне нужно копировать тот же самый код для каждого производного класса? Ниже приводится то, что я использую сейчас. В случае изменения ответа требуется полиморфизм времени выполнения.Как обобщать конструктор копирования для производных классов?

class A { 
public: 
    A(const A& a): base_p {a.base_p->create_copy()} {} 
private: 
    unique_ptr<Base> base_p; 
}; 

class Base { 
public: 
    virtual unique_ptr<Base> create_copy() const; 
}; 

class Derived : public Base { 
public: 
    unique_ptr<Base> create_copy() const override { 
    return make_unique<Derived>(*this); 
    } 
}; 

Одна из идей, я был связан с использованием какой-то код, как:

return make_unique<remove_reference_t<decltype(*this)>>(*this); 

Однако этот код не работает в константной функции члена. Также я думаю, что мне все равно придется явно переопределять метод create_copy() в каждом производном классе, так как decltype (* this) оценивается во время компиляции, и поэтому включение этого кода в метод базового класса не принесет мне никакой пользы.

EDIT: Ответ на вопрос Inheritance in curiously recurring template pattern polymorphic copy (C++) более сложный, чем то, что мне нужно. У меня есть простая иерархия наследования глубины 1, которую никогда не нужно расширять до большей глубины. Ответ Иорро вместе с предоставленной связью был достаточным для решения моей проблемы.

+0

Возможно, вас заинтересует [это сообщение] (https://stackoverflow.com/questions/196733/how-can-i-use-covariant-return-types-with-smart-pointers) – CoryKramer

+0

Возможный дубликат [ Наследование в любопытно повторяющейся шаблонной полиморфной копии шаблона (C++)] (http://stackoverflow.com/questions/9422760/inheritance-in-curiously-recurring-template-pattern-polymorphic-copy-c) –

+0

Нужен ли дизайн 'unique_ptr', где содержимое клонируется при каждой копии!? –

ответ

2
  • имеют промежуточный BaseImplCopy шаблон класса
  • Реализовать create_copy() для T в нем
  • Сделать это извлечь из базы
  • Пусть Производная проистекают из BaseImplCopy

Это называется CRTP и широко используется. Обратите внимание, что вам может понадобиться static_cast (this) в BaseImplCopy.

Btw, create_copy() условно называется clone().

+0

http://stackoverflow.com/questions/12255546/c-deep-copying-a-base-class-pointer?rq=1 search for BaseCRTP – lorro

+0

Спасибо. Я попробую. –

+0

Он работал как шарм :) –

Смежные вопросы