저는 Java/PHP에서 제공하는 C++을 처음 접했습니다. 기본적으로 가상 클래스 인스턴스 (기본 클래스)에 대한 고유/공유 포인터에 대한 참조를 보유 할 컨테이너 클래스를 만들어야합니다. 이 코드를 컴파일 할 수 없습니다 (MSVC 2015 사용). 여기 컨테이너 클래스의 shared_ptr/unique_ptr에 가상 객체 사용
error C2280: 'std::unique_ptr<Base,std::default_delete<_Ty>>::unique_ptr(const std::unique_ptr<_Ty,std::default_delete<_Ty>> &)': attempting to reference a deleted function
문제를 재현하는 샘플 응용 프로그램입니다 :
컴파일러 오류는
가#include <iostream>
#include <memory>
class Base {
public:
virtual void foo() const = 0;
virtual void bar() const = 0;
};
class Derived : public Base {
public:
void foo() const override {
std::cout << "foo" << std::endl;
};
void bar() const override{
std::cout << "bar" << std::endl;
};
};
class ContainerUnique {
public:
ContainerUnique() {
ptr = nullptr;
}
void assignPtr(const Base &instance) {
auto ptr = std::make_unique<Base>(instance);
ptr.swap(ptr);
};
std::unique_ptr<Base> getPtr() {
return ptr;
};
private:
std::unique_ptr<Base> ptr;
};
class ContainerShared {
public:
ContainerShared() {
ptr = nullptr;
}
void assignPtr(const Base &instance) {
auto ptr = std::make_shared<Base>(instance);
ptr.swap(ptr);
};
std::shared_ptr<Base> getPtr() {
return ptr;
};
private:
std::shared_ptr<Base> ptr;
};
int main() {
Derived derived1 = Derived();
Derived derived2 = Derived();
ContainerUnique cu = ContainerUnique();
ContainerShared cs = ContainerShared();
cu.assignPtr(derived1);
cs.assignPtr(derived2);
std::unique_ptr<Base> uptr = cu.getPtr();
std::shared_ptr<Base> sptr = cs.getPtr();
return 0;
}
'표준을 :: getPtr unique_ptr()'카피를 돌려줍니다. 'unique_ptr'을 복사 할 수 없습니다. 당신이 달성하고자하는 의미가 무엇인지 모르겠습니다. 'getPtr'는 소유권을 공유 할 것으로 예상됩니까? 그렇다면'unique_ptr'을 사용할 수 없습니다. 그렇지 않은 경우 스마트 포인터를 반환하지 마십시오. –
오류와 관련이 없습니다 : 재정의 된 기본 생성자가 필요하지 않으므로이 경우'ptr.swap '(또는 같은 이름의 임시 변수)을 사용하면 안됩니다. 단지'ptr = std :: make_unique (인스턴스);'충분하다 –
UnholySheep
@ UnholySheep. 컴파일러는'오류 C2259 : 'Base': 추상 클래스를 인스턴스화 할 수 없다' –