2009-09-28 3 views
10

は、私は次の(単純化の場合)があるとします、私はのコピーコンストラクタに抽象IColorのディープコピーを行うための任意の方法は、今コピーコンストラクタ:深い抽象クラスをコピー

class Color; 

class IColor 
{ 
public: 
    virtual Color getValue(const float u, const float v) const = 0; 
}; 

class Color : public IColor 
{ 
public: 
    float r,g,b; 
    Color(float ar, float ag, float ab) : r(ar), g(ag), b(ab) {} 
    Color getValue(const float u, const float v) const 
    { 
     return Color(r, g, b) 
    } 
} 

class Material 
{ 
private: 
    IColor* _color; 
public: 
    Material(); 
    Material(const Material& m); 
} 

あり材料?つまり、IColorへのポインタだけでなく、m._colorの値(Color、Texture)をコピーする必要があります。

答えて

7

インターフェイスにclone()関数を追加できます。

1

マテリアルコピーコンストラクタにそのコードを追加する必要があります。次に、デストラクタで割り当てられたIColorを解放するようにコードします。

また、IColorに仮想デストラクタを追加することもできます。

ディープコピーを自動的に行う唯一の方法は、IColorへのポインタの代わりに直接色を保存することです。

+0

IColorにポインタを格納すると、ディープコピーが無効になるのはなぜですか? –

+0

デフォルトでは、単にポインタアドレスをコピーしたポインタアドレスにコピーするだけです。ポインティングされているものをコピーしてポインタを再調整しません。 Lukeは、コピーコンストラクタから呼び出されたclone()関数を作成する際に最善の提案をしています。 –

0

を見て、おそらく最高のですが、そのオプションを持っていない場合は、別の解決策は、* ColorにIColor *をキャストするためにはdynamic_castを使用することです。次に、Colorコピーコンストラクタを呼び出すことができます。

+0

しかし、カラーかテクスチャかどうかはわかりませんが、どうやってdynamic_castできますか? – Barth

+0

オブジェクトの型がcolorでなければ、dynamic_cast (_color)はnullを返します。 (動的キャスト/ rttiは、クラスに少なくとも1つの仮想メソッドがある限り、実際の型が何であるかを検出できます)。だからあなたができることは、可能性をテストすることです。これは楽しいことではなく、ほとんどの場合、clone()メソッドを使用して悪化しますが、このようなことを行う必要があるまれな状況があります。 –

関連する問題