如何正确地为抽象类创建深层副本?

时间:2017-04-15 11:23:01

标签: c++ interface copy-and-swap

我正在处理碰撞系统,我需要复制实体的碰撞器。

我制作了这样的系统,例如我不需要设置我想要处理碰撞的方式,(我将开始使用AABB,但可能会更改为SAT)但我需要进行深层复制我将使用哪个算法的碰撞器。

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

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

因此,我开始写这个:

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

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

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

如果不是设计方面或技术方面,我真的不知道自己做错了什么,所以我完全接受建议。

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

1 个答案:

答案 0 :(得分: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 = for each algorithm。没有operator = defined的算法实现将无法链接。