假设我有以下情况(简化情况):
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);
}
字符串
现在,我有没有办法在Material的复制构造函数中对抽象的IColor进行深度复制?也就是说,我希望复制任何m._color的值(Color,Texture),而不仅仅是IColor的指针。
6条答案
按热度按时间iovurdzv1#
你必须自己将这些代码添加到材质复制构造函数中,然后在析构函数中释放分配的IColor。
您还需要向IColor添加一个虚析构函数。
自动进行深度复制的唯一方法是直接存储颜色,而不是存储指向IColor的指针。
6ljaweal2#
给color添加一个clone()方法可能是最好的,但是如果你没有这个选项,另一个解决方案是使用dynamic_cast将IColor* 转换为Color*。然后你可以调用Color复制构造函数。
vm0i2vca3#
如果你有一个“类似工厂”的类来为你创建Colors,你可以为用户实现一个类型擦除的上转换复制构造函数。在你的情况下,它可能不适用,但当它适用时,我发现它比在实现者身上强制执行克隆函数更优雅。
字符串
zlhcx6iw4#
您可以使用Prototype设计模式来克隆对象:https://refactoring.guru/design-patterns/prototype。它本质上是在接口中声明一个
clone()
方法,并在每个实现中定义它。omhiaaxx5#
查看the virtual constructor idiom
disho6za6#
你可以在接口中添加一个clone()函数。