Tengo una clase con un std::unique_ptr
como miembro de la clase. Me preguntaba cómo definir correctamente el constructor de copia, ya que recibo el siguiente mensaje de error del compilador: error C2248: std::unique_ptr<_Ty>::unique_ptr : cannot access private member declared in class 'std::unique_ptr<_Ty>
. Mi diseño de la clase se ve algo como:Copiar el constructor con el puntero inteligente
template <typename T>
class Foo{
public:
Foo(){};
Foo(Bar<T> *, int);
Foo(const Foo<T> &);
~Foo(){};
void swap(Foo<T> &);
Foo<T> operator = (Foo<T>);
private:
std::unique_ptr<Bar> m_ptrBar;
int m_Param1;
};
template < typename T >
Foo<T>::Foo(const Foo<T> & refFoo)
:m_ptrBar(refFoo.m_ptrBar),
m_Param1(refFoo.m_Param1)
{
// error here!
}
template < typename T >
void Foo<T>::swap(Foo<T> & refFoo){
using std::swap;
swap(m_ptrBar, refFoo.m_ptrBar);
swap(m_Param1, refFoo.m_Param1);
}
template < typename T >
Foo<T> Foo<T>::operator = (Foo<T> Elem){
Elem.swap(*this);
return (*this);
}
@ Cubbi, gracias. Ahora tengo otro problema. La clase 'Bar' es en realidad una clase base abstracta, y por lo tanto recibo un nuevo mensaje de error:' error C2259: 'Bar': no se puede crear una instancia de clase abstracta', ¿Hay alguna solución, además de convertir la clase base abstracta, en una clase base simple? – Tin
@Tin: en ese caso, deberá agregar una función virtual 'clone()' pura a la clase base, anulada en cada clase derivada para crear una copia usando 'new'. Entonces el inicializador se convierte en 'bar (foo.bar? Foo.bar-> clone(): nullptr)'. –
@Tin Las preguntas frecuentes de C++ llaman a eso ["constructor virtual"] (http://www.parashift.com/c++faq-lite/virtual-functions.html#faq-20.8) – Cubbi