我创建了一个场景图层次结构,其中每个节点都有一个父节点和可能的子节点。我创建了这个BaseNode类
class BaseNode
{
public:
BaseNode(const char *nodeName, BaseNode *parent);
~BaseNode();
BaseNode* addChildSceneNode(const char *name);
void deleteChildSceneNode(const char *name);
void deleteAllChildSceneNodes();
BaseNode* findFirstSceneNode(const char *name);
BaseNode* getChildSceneNode(const char *name);
BaseNode* getChildSceneNode(unsigned int index);
void setName(const char *name);
void setTranformation(const glm::mat4 &transformation);
unsigned int getNumChildren() const { return _children.size(); }
const char *name() const { return _name.c_str(); }
BaseNode* parent() const { return _parent; }
const glm::mat4& transformation() const { return _transformation; }
const glm::mat4& toRootTransformation() const { return _toRoot; }
protected:
std::string _name;
glm::mat4 _transformation;
glm::mat4 _toRoot;
BaseNode *_parent;
std::vector<BaseNode*> _children;
};
我有这个从BaseNode继承的SceneNode类
class SceneNode : public BaseNode
{
public:
SceneNode(const char *nodeName, SceneNode *parent);
~SceneNode();
void attachRenderMeshData(RenderMeshData *renderMeshData);
const std::vector<RenderMeshData*>* renderMeshDatas() { return &_meshDatas; }
private:
std::vector<RenderMeshData*> _meshDatas;
};
现在我的问题是关于包含BaseNode *参数的所有成员函数。
目前,在使用SceneNode对象时,我必须将BaseNode *显式地转换为SceneNode *,如下所示
SceneNode *mySceneNode = new SceneNode("root", nullptr);
mySceneNode->addChildSceneNode("my child");
SceneNode *child = reinterpret_cast<SceneNode*>(mySceneNode->getChildSceneNode("my child")); //i thought this should be dynamic_cast but the compiler throws an error.. weird
我的目标是拥有多种类型的&#34; BaseNode,所以我不必每次都重写其父/子功能。
知道我怎么能做得更好吗?
答案 0 :(得分:1)
为什么不为BaseNode
课程使用模板?
这样,您可以在不同类型的BaseNode之间使用公共代码。
例如,要制作SceneNode
,您可以BaseNode<SceneNode>
。
An example on C++ class templates.
如果SceneNode
继承BaseNode
,您只需将SceneNode
分配给BaseNode*
类型,而无需投射。您可能还需要调用基类的构造函数。
class SceneNode : public BaseNode {
public:
SceneNode() : BaseNode("foo") {}
};
由此,如果您致电s = new SceneNode
,您应该可以将s分配给BaseNode*
的集合,而无需投放。