2009-09-28 134 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