如果我想在 C++ 中克隆一个多态对象(即从其他类 B 派生的类 A 的实例),最简单的方法似乎是给 B 一个虚拟克隆成员函数,它必须被覆盖A 看起来像这样
A* clone(){
return new A(*this);
}
我的问题是,我发现这种不必要的样板代码,因为如果想使用 C++ 的运行时多态特性,这几乎总是需要的。如何规避?
谢谢
为什么我需要这个:
我的用例可以抽象为以下示例:
我有一个 class Integral
,它计算某个函数的积分。这样做,他们有一个成员,它是指向 class MathFunction
的指针。这个抽象类包含一个纯虚函数evaluate
,它接受一个参数。我想实现幂函数,我将创建一个 class PowFunction : class MathFunction
。此类将有一个成员 exponent
,函数 evaluate 如下所示:
double evaluate(x){
return pow(x,exponent);
}
如前所述,class Integral
的成员 MathFunction
必须是多态的,这要求它是一个指针。用另一个问题回答评论者的问题。为什么我不想制作 MathFunction 对象的拷贝?
我真的希望 Integral “拥有”它的 MathFunction,这意味着它可以更改参数(如 exponent
)而不更改任何其他 Integral 对象的 MathFunction。这意味着每个 Integral 都需要有自己的拷贝。这需要 MathFunctions 的 clone() 函数,不是吗?
我想到的一个替代方案是:如果多个 Integral 对象可以通过指向相同地址的指针共享相同的 MathFunction,我可以创建 Integral 对象的拷贝而无需复制 MathFunction。但在这种情况下,我必须将所有属性设置为 const 或以某种方式设置为只读,这也不是很优雅。另外,哪个 Integral 对象应该处理删除 MathFunction 对象?
为什么需要这个:
您是认真的说,一旦您使用多态对象,您就不再需要复制操作了吗?是什么让多态对象在这方面与其他对象不同?
使用这个论证,您还可以将复制构造函数和复制赋值运算符抛出 C++ 标准!
最佳答案
减少克隆多态对象的需要。真的,我很少在我自己的代码中发现需要这样做,而且对这个问题的评论表明,我并不是唯一一个认为如果你发现自己克隆所有东西的人,你可能设计错了。
当然,永远不要无益,您确实可以使用 Curiously Recurring Template Pattern。
template<typename T> struct Clone {
virtual T* clone() { return new T(static_cast<const T&>(*this)); }
};
关于c++ - 如何避免 c++ 中多态对象的 clone() 样板代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6283272/