의 내가 형 푸의 unique_ptr 객체를 집계 클래스 FooContainer 있다고 가정 해 봅시다깊은 복사 생성자
#include <vector>
#include <memory>
class FooContainer
{
protected:
std::vector<std::unique_ptr<Foo>> many;
//other attributes
public:
FooCoontainer(const FooContainer&);
//handling functions for Foo
};
문제는 제대로 깊은 복사 생성자를 구현하고 어떤 구문입니다하는 방법입니다 그것을 위해. 간단히
FooContainer::FooContainer(const FooContainer& fc)
{
many=fc.many;
}
를 할당하는 포인터를 복사하려고 시도하고있을 것 (고맙게도) unique_ptr에 대한 컴파일러에 의해 허용되지 않습니다. 그래서 나는 이와 같은 일을해야 할 것입니다.
FooContainer::FooContainer(const FooContainer& fc)
{
many.reserve(fc.many.size());
for(int i=0;i<fc.many.size();i++)
many.emplace_back(new Foo(*fc.many[i]));//assume that Foo has a copy constructor
}
이것을하는 방법입니까? 아니면 unique_ptr 대신 shared_ptr을 사용해야합니까?
나는 또한 추가 질문이 있습니다.
똑똑한 포인터 (그리고 위의 코드에서 보호 된)의 이유는 Foo의 하위 클래스 인 많은 개체 모음을 집계하는 BarContainer 클래스를 파생 시켰기 때문입니다. Bar의 처리가 Foo와 매우 유사하기 때문에이 접근법은 두 개의 개별 클래스에 비해 많은 중복 코드를 저장할 수 있습니다.
그러나,. BarContainer의 복사본 생성자는 문제가 있습니다. FooContainer의 콜 복사 생성자는 agead가되고 전체 Bar 대신 Foo 부분 만 복사합니다. 더 나쁜 경우, Bar의 가상 메소드를 호출하면 Foo 버전이 호출됩니다. 그래서이 동작을 재정의 할 방법이 필요합니다. 복사 생성자를 가상으로 만들 수 없습니다. 또한 Bar의 복사 생성자는 Foo 복사 생성자의 결과를 무시하고 올바른 복사를 수행 할 수 있지만 이는 매우 비효율적입니다.
그래서이 문제를 해결하는 가장 좋은 해결책은 무엇입니까?
'unique_ptr'copy-constructed를 반환 할 수있는'Foo' 및 그 서브 클래스에 가상'clone()'멤버 함수가 있어야합니다. '* '. –
Oktalist