gpt4 book ai didi

c++ - 节点层次和继承

转载 作者:行者123 更新时间:2023-11-28 06:06:23 25 4
gpt4 key购买 nike

我制作了一个场景图层次结构,其中每个节点都有一个父节点,可能还有一个子节点。我创建了这个 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 使用模板呢?类(class)?

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

例如,制作一个SceneNode , 你可以做 BaseNode<SceneNode> .

An example on C++ class templates.


如果SceneNode继承BaseNode你可以简单地分配 SceneNodeBaseNode*没有类型转换的类型。您可能还需要调用基类的构造函数。

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

由此,如果您调用 s = new SceneNode ,您应该能够将 s 分配给 BaseNode* 的集合没有 Actor 。

关于c++ - 节点层次和继承,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32313310/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com