gpt4 book ai didi

c++自动推导派生类

转载 作者:行者123 更新时间:2023-11-30 01:49:40 25 4
gpt4 key购买 nike

假设我有一个这样的基类:

class BaseNode
{
BaseNode* nodeA;
BaseNode* nodeB;
};

派生类如下:

class DecisionNode : public BaseNode
{
//lots of variables and functions about decision making
};

class ActionNode : public BaseNode
{
//lots of variables and functions about performing actions
};

还有一种逻辑类:

class Logic
{
std::vector<BaseNode*> nodes;//contains DecisionNodes and ActionNodes...

void handleNodeAutomatically(BaseNode* node)
{
//some funky deduction code....
//send the node to the relevant function below
}

void handleDecisionNode(DecisionNode* node)
{
//perform decision-specific code here....
}

void handleActionNode(ActionNode* node)
{
//perform action-specific code here....
}
};

关于我应该如何实现“handleNodeAutomatically”函数,您有什么建议?或者我对这应该如何工作的整个想法完全是垃圾(如果是,请告诉我!)

我知道我可以做这样的事情:

if(dynamic_cast<ActionNode*>someNode != NULL) //it turns out it's an action

但这对我来说似乎有点令人费解。而且我相信 dynamic_cast 也有一些与之相关的开销。

我也可以有一个大的 actionAndDecisionNode 类,所有 两个类的属性和一个 bool “isDecisionNode”值,然后测试它,或者一个“nodeType”枚举,但同样这些方法感觉有点乱。

因此,如果您愿意,请尝试填充“handleNodeAutomatically”函数中的空白。或者,或者,告诉我这个计划注定要失败,然后告诉我一个更好的方法。

谢谢!

最佳答案

你或许可以在所有三个类中都有一个方法,并从 Logic 类中调用它:

class BaseNode {
// ...
virtual void foo();
};

class ActionNode : public BaseNode {
// ...
void foo(); // implements the Action version of foo()
};

class DecisionNode : public BaseNode {
// ...
void foo(); // implements the Decision version of foo()
};

然后:

class Logic {
void handleNodeAutomatically(BaseNode* node)
{
node->foo();
}
};

注意:有关一些技术细节,请参阅下面的评论(@BasileStarynkevitch 和@ChristianHackl)。

关于c++自动推导派生类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28656430/

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