【发布时间】:2019-12-29 15:43:00
【问题描述】:
我想要一个 Collider 接口类,其中将有一个重载的 -> 运算符来直接访问 BoxCollider 派生类。我想通过界面访问 box collider 的成员并在运行时更改对撞机的类型。 所以我想到了使用模板:
template<typename T>
class ColliderV2 {
public:
virtual T* operator ->() = 0;
};
class BoxColliderV2 : public ColliderV2<BoxColliderV2> {
public:
float width;
float height;
BoxColliderV2* operator ->() {
return this;
}
};
int main()
{
ColliderV2<BoxColliderV2>* col = new BoxColliderV2;
(*col)->width = 1;
}
这行得通。但是据我所知,templates 会在编译时用 Box Collider 填充 T 生成一个全新的 Collider 类,对吗?这就是它起作用的原因。但后来它阻止我改变对撞机类型。我还想过在派生类BoxCollider* operator->() ;中创建一个带有Collider* operator->() ;重载的虚拟碰撞器类
但如果我尝试过:
Collider<BoxCollider>* col = new BoxCollider;
(*col)->width = 1; // won't work
由于 Collider 不是 BoxCollider,因此不起作用。而且我不想 dynamic_cast 我可能拥有的所有可能的对撞机类型。那么,这里可以做什么呢?
【问题讨论】:
-
请注意并更正示例代码中的类型名称。就目前而言,工作和非工作示例都完全相同(据我所知)。
-
是的,最后一个例子应该是
Collider<BoxCollider>* col = new BoxCollider;。错字。马上改正。 -
V2对您的问题重要吗? -
@Ulrich Eckhardt 不是真的,我只是在创建一些类并同时测试一个又一个。因此,为了不具有同名的类,我在名称的末尾添加了 V2。但是我问问题时忘记删除了。
-
在分配
(*col)->width = 1;时,您如何期望知道*col是具有width成员的(动态)类型?在某个地方,您需要以某种方式做出决定,而当您这样做时,它可能会为必要的解决方案提供线索。
标签: c++ templates interface polymorphism