0

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

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

一方面,深拷贝是一种要求,而复制和交换习语似乎是我应该去的。

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

因此,我开始写这个:

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

但我不能复制构造collidable,因为它是纯虚拟的。

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

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

如何强制从可碰撞的类派生来实现 operator= ?

4

1 回答 1

1

您可能将接口的使用与类实现混淆了。这可能是因为纯虚拟类是 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= 的算法实现根本无法链接。

于 2017-04-16T03:02:43.877 回答