2009-09-28 136 views
10

假設我有以下的(簡單情況):拷貝構造函數:深複製一個抽象類

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(一種顏色,一種紋理)的值,而不僅僅是指向IColor的指針。

回答

7

您可以將clone()函數添加到您的界面。

1

您必須將該代碼自己添加到Material複製構造函數。然後在解析器中釋放已分配的IColor。

您還需要爲IColor添加虛擬析構函數。

自動執行深度複製的唯一方法是直接存儲顏色,而不是指向IColor的指針。

+0

爲什麼在IColor上存儲指針會禁用深度複製? – 2009-09-28 14:25:53

+0

因爲默認情況下,它只會將指針地址複製到複製的指針地址中。它不會複製正在指向的內容,然後重新調整指針。 Luke在製作從複製構造函數調用的clone()函數時有最好的建議。 – 2009-09-28 14:35:38

0

添加clone()方法,以顏色可能是最好的,但如果你沒有這樣的選擇,另一種解決方案是使用dynamic_cast的投ICOLOR *爲顏色*。然後你可以調用Color copy構造函數。

+0

但是你不知道它是一種顏色還是紋理,你怎麼能dynamic_cast呢? – Barth 2010-01-15 16:01:57

+0

如果對象不是顏色,dynamic_cast (_color)將返回null。 (只要類至少有一個虛擬方法,動態轉換/ rtti就可以檢測實際類型。所以你可以做的是測試可能性。這並不好玩,並且使用clone()方法幾乎總是更糟糕,但是在極少數情況下,您必須這樣做。 – 2010-01-21 21:07:37