Ho una classe con uno std::unique_ptr
come membro della classe. Mi stavo chiedendo, come definire correttamente il costruttore di copie, dal momento che sto ricevendo il seguente messaggio di errore del compilatore: error C2248: std::unique_ptr<_Ty>::unique_ptr : cannot access private member declared in class 'std::unique_ptr<_Ty>
. Il mio progetto di classe sembra qualcosa di simile:Copia costruttore con puntatore intelligente
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, grazie. Ho ora un altro problema. La classe 'Bar' è in realtà una classe base astratta, e quindi sto ricevendo un nuovo messaggio di errore:' errore C2259: 'Bar': impossibile istanziare la classe astratta', C'è una soluzione, oltre a trasformare la classe base astratta, in una semplice classe base? – Tin
@Tin: in tal caso, sarà necessario aggiungere una funzione 'clone()' virtuale alla classe base, sovrascritta in ogni classe derivata per creare una copia usando 'new'. Quindi l'inizializzatore diventa 'bar (foo.bar? Foo.bar-> clone(): nullptr)'. –
@Tin Le domande frequenti su C++ chiamano ["virtual constructor"] (http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8) – Cubbi