繁体   English   中英

节点层次结构和继承

[英]Node hierarchy and inheritance

我制作了一个场景图层次结构,其中每个节点都有一个父级,也可能有一个子级。 我创建了这个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

我的目标是拥有“许多类型”的BaseNode,因此我不必每次都重写其父/子功能。

知道我该如何做得更好吗?

为什么不为您的BaseNode类使用模板?

这样,您就可以在不同类型的BaseNode之间使用通用代码。

例如,要创建一个SceneNode ,您可以执行BaseNode<SceneNode>

有关C ++类模板的示例。


如果SceneNode继承了BaseNode ,则可以简单地将SceneNode分配给BaseNode*类型,而无需BaseNode* 您可能还需要调用基类的构造函数。

class SceneNode : public BaseNode {
public:
    SceneNode() : BaseNode("foo") {}
};

由此,如果调用s = new SceneNode ,则无需进行BaseNode*应该能够将s分配给BaseNode*的集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM