【发布时间】:2013-09-30 10:32:03
【问题描述】:
我正在编写一个四叉树类作为图形库的一部分,我正面临一个设计问题。 一个主要目标是允许库的用户使用他们自己的节点类型轻松扩展四叉树。每个节点都有一个指向其四个子节点中的第一个的指针。在拆分父节点时,我使用原型模式四次“克隆”父节点(库不知道其真实类型)。所以这里是 Node 类:
class CNode {
public:
virtual CNode* clone();
protected:
CNode* pChilds;
}
库的用户现在可以定义自己的节点并添加遍历方法:
class MyNode : public CNode {
public:
virtual CNode* clone() {
return new MyNode;
}
void myTraverse() {
if(pChilds[0] != nullptr)
static_cast<MyNode*>(pChilds[0])->traverse();
}
}
可以看出,我必须从基类转换到派生类。或者,我可以制作所有与四叉树相关的类模板,但我真的不想这样做。 我也不能使用升压。除了 boost:: 任何类似的解决方案,使用 RTTI 或动态转换都会变慢,因为四叉树是性能关键组件,必须尽可能快地运行!
在增加一些类型安全性的同时,是否有可能保持 static_cast 的速度? (四叉树只会包含单一类型的节点)。
【问题讨论】:
-
我已经标记了你的问题 [C++]。如果这不正确,请随时恢复并添加不同的语言标签。
-
并澄清您的问题:
myTraverse成员函数是如何被调用的?它是由图书馆调用的吗?如果是这样,库是如何知道它的,因为它没有在基类中定义? -
澄清:“myTraverse”是从已知 MyNode 的地方调用的,所以这不是问题
标签: c++ casting containers quadtree