2010-11-24 9 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 

EDIT:

は、私はあなたの基底クラスは抽象的であるあなたの質問に気づきました。それはいいです、このモデルはまだ動作します、私は修正しました。

+0

ここでコピーコンストラクタは実際には適切ではありません。通常は、多態性クラスまたは値クラスのいずれかを選択します。 –

+0

私のワークスペースにあなたのクローンを送ることができますか?ありがとう;) – Stormenet

2

クラスに仮想Clone()メソッドを追加します。

A* copy = it->Clone(); 

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

派生クラスのクローンをオーバーライドします。実装が使用クローニング

2

クラスAで純粋な仮想クローン機能を実装できます。

2

他の人からは、何らかのタイプのクローンメカニズムが必要だと言われています。 Kevlin Henneyの優秀論文Clone Alonecloning_ptrをチェックしてみてください。

+0

+1、それは良い読書でした。 –

関連する問題