Mam klasy z jednym std::unique_ptr
jako członka klasy. Zastanawiam się, jak poprawnie zdefiniować konstruktora kopiowania, ponieważ otrzymuję następujący komunikat o błędzie kompilatora: error C2248: std::unique_ptr<_Ty>::unique_ptr : cannot access private member declared in class 'std::unique_ptr<_Ty>
. Moja klasa konstrukcja wygląda mniej więcej tak:Kopiuj konstruktora z inteligentnym wskaźnikiem
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, dzięki. Mam teraz inny problem. Klasa 'Bar' jest w rzeczywistości abstrakcyjną klasą bazową, dlatego otrzymuję nowy komunikat o błędzie:' error C2259: 'Bar': nie można utworzyć instancji klasy abstrakcyjnej', Czy istnieje rozwiązanie, oprócz zamiany abstrakcyjnej klasy bazowej, na prosta klasa podstawowa? – Tin
@ Tin: w takim przypadku będziesz musiał dodać czystą wirtualną funkcję 'clone()' do klasy bazowej, nadpisaną w każdej klasie pochodnej, aby utworzyć kopię za pomocą 'new'. Następnie inicjatorem staje się 'bar (foo.bar? Foo.bar-> clone(): nullptr)'. –
@Tin C++ FAQ wywołuje, że ["wirtualny konstruktor"] (http://www.parashift.com/c++-faq-lite/virtual-functions.html#faq-20.8) – Cubbi