如何正确地为摘要 类 制作深拷贝?

How to correctly make deep copy for abstract classes?

我正在开发一个碰撞系统,我需要为其复制实体的碰撞器。

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

一方面,深度复制是一项要求,复制和交换 习语似乎是我应该去的。

另一方面,我的 collidable 除了接口之外不需要任何东西,所以没有理由不做纯虚拟的。

因此,我开始写这个:

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

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

注意在同一个程序中,我绝不会同时使用超过一种碰撞算法,所以不会有方法冲突。

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

如何强制 class 派生的 collidable 来实现 operator= ?

您可能将接口的使用与 class 实现混淆了。这可能是因为纯虚拟 classes 是 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; 
    ...
}

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

如果您只使用您所说的一种算法类型,请使每个算法的使用者 classes class 模板化 classes。然后,当您对算法实现进行操作并在每个算法 class 上调用 operator= 时,编译器应该在 linking 期间为每个算法实现强制使用 operator=。没有定义 operator= 的算法实现根本无法 link.