2010-11-24 2 views
4

개체에 대한 포인터가있는 벡터의 전체 복사본이 필요하지만 개체는 C 또는 B 중 하나 일 수 있습니다. 혼란 스럽다는 것을 알고 (설명하는 방식으로) 설명해 드리겠습니다.개체에 대한 포인터의 벡터, 벡터의 깊은 복사본이 필요하지만 개체는 상속 된 개체의 기본 개체입니다

class A { 
    A(const A& copyme) { } 
    void UnableToInstantiateMeBecauseOf() =0; 
}; 

class B { 
    B(const B& copyme) : A(copyme) {} 
}; 

class C { 
    C(const C& copyme) : A(copyme) {} 
}; 

std::vector<A*>* CreateDeepCopy(std::vector<A*>& list) 
{ 
    std::vector<A*>* outList = new std::vector<A*>(); 

    for (std::vector<A*>::iterator it = list.begin(); it != list.end(); ++it) 
    { 
     A* current = *it; 
     // I want an copy of A, but it really is either an B or an C 
     A* copy = magic with current; 
     outList->push_back(copy); 
    } 

    return outList; 
} 

상속 된 형식이 아닌 개체의 복사본을 만드는 방법은 무엇입니까?

답변

4

클래스 A.와 동일합니다 :

Copy object - keep polymorphism

class Super 
{ 
public: 
    Super();// regular ctor 
    Super(const Super& _rhs); // copy constructor 
    virtual Super* clone() const = 0; // derived classes to implement. 
}; // eo class Super 


class Special : public Super 
{ 
public: 
    Special() : Super() {}; 
    Special(const Special& _rhs) : Super(_rhs){}; 
    virtual Special* clone() const {return(new Special(*this));}; 
}; // eo class Special 

편집 :

내가 당신의베이스 클래스는 추상 클래스입니다 귀하의 질문에 나타났습니다. 괜찮습니다.이 모델은 여전히 ​​작동합니다. 제가 수정했습니다.

+0

복사 생성자가 여기에 적합하지 않습니다. 일반적으로 다형성 클래스 또는 값 클래스 중 하나를 선택합니다. –

+0

내 작업 공간으로 나에게 클론을 보낼 수 있습니까? 감사합니다;) – Stormenet

2

클래스에 가상 Clone() 메소드를 추가하십시오.

A* copy = it->Clone(); 

class A { 
    virtual A* Clone() 
    { 
     return new A(*this); 
    } 
}; 

파생 클래스에서 복제를 재정의하십시오. 구현을 사용하여 복제

2

클래스 A에 순수 가상 복제 기능을 구현할 수 있습니다.

2

다른 사람들은 어떤 유형의 복제 메커니즘이 필요하다고 말했기 때문에. Kevlin Henney의 우수 논문 Clone Alone에서 cloning_ptr을 확인하고 싶을 수도 있습니다.

+0

+1, 좋은 읽을 거리였습니다. –

관련 문제