所以说我有这样一个基类:
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类,其中 all 两个类的属性和一个布尔“isDecisionNode”值,只是测试它,或者'nodeType'枚举,但是这些方法只是感觉有点乱。
所以,如果它让你高兴,请注意填写'handleNodeAutomatically'功能中的空白。或者,或者,告诉我这个计划完全注定要失败,并告诉我一个更好的方法。
谢谢!
答案 0 :(得分:4)
你可能在所有三个类中都有一个方法,并从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)。