如何正确制作抽象类的深拷贝?

How to correctly make deep copy for abstract classes?

本文关键字:深拷贝 抽象类 何正确      更新时间:2023-10-16

我正在研究一个碰撞系统,我需要复制实体的碰撞体。

我使系统,例如我不必一成不变地处理碰撞,(我可能会开始使用AABB,但可能会更改为SAT),但是无论我将使用哪种算法,我都需要对碰撞机进行深度复制。

一方面,深拷贝是要求,抄袭换成语似乎是我应该去的。

另一方面,我的collidable不需要是界面以外的任何东西,所以没有理由不做纯虚拟。

因此,我首先写了这个:

class collidable
{
public:
virtual collidable& operator= (collidable other)=0;
};

但我无法复制构造collidable因为它是纯虚拟的。

请注意,在同一程序中,我永远不会同时使用多个碰撞算法,因此不会有方法冲突。

我真的不知道我做错了什么,无论是设计方面还是技术方面,所以我完全愿意接受建议。

如何强制可碰撞派生的类来实现运算符= ?

您可能混淆了接口与类实现的使用。 这可能是因为纯虚拟类是C++定义接口的方式。

通过您的实现,您不会有太多运气,因为您将获得以下类型的方案:

class A : public collidable
{
...
}
class B : public collidable
{
...
}
int main (int argc, char** argv)
{
collidable *A = new A ();
collidable *B = new B ();
*A = *B; 
...
}

这显然是一个问题。 您要做的是定义适用于接口中每个不同算法实现的泛型操作。 赋值可能不是这些泛型操作之一,因为赋值需要使用两个相同的类型来完成。

如果您只使用您所说的一种算法类型,请将每个算法类的使用者类设置为模板化类。 然后,当您对算法实现进行操作并在每个算法类上调用 operator= 时,编译器应在链接期间为每个算法实现强制 operator=。 未定义 operator= 的算法实现根本无法链接。