我正在编写一个四叉树类作为图形库的一部分,我正面临一个设计问题。 主要目标是允许库的用户使用他们自己的节点类型轻松扩展四叉树。每个节点都有一个指向其四个孩子中第一个孩子的指针。我使用原型模式在分割时克隆父节点(它的真实类型对库是未知的)四次。因此,这里的节点类:通用四叉树
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已知的地方被调用,所以这不是问题 – user2830627