如何正确地为摘要 类 制作深拷贝?
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.
我正在开发一个碰撞系统,我需要为其复制实体的碰撞器。
我制作的系统不需要一成不变地处理碰撞,(我可能会开始使用 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.