c++自动推导派生类
c++ automatic deduction of derived classes
假设我有这样一个基础class:
class BaseNode
{
BaseNode* nodeA;
BaseNode* nodeB;
};
并派生 classes 沿线:
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:
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 class 和 all classes 的属性和布尔值 "isDecisionNode",然后测试一下,或者 'nodeType' 枚举,但是这些方法还是感觉有点乱。
因此,如果您愿意,请尝试填补 'handleNodeAutomatically' 函数中的空白。或者,或者,告诉我这个计划注定要失败,并告诉我一个更好的方法。
谢谢!
您或许可以在所有三个 class 中都有一个方法,并从 Logic
class:
中调用它
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)。
假设我有这样一个基础class:
class BaseNode
{
BaseNode* nodeA;
BaseNode* nodeB;
};
并派生 classes 沿线:
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:
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 class 和 all classes 的属性和布尔值 "isDecisionNode",然后测试一下,或者 'nodeType' 枚举,但是这些方法还是感觉有点乱。
因此,如果您愿意,请尝试填补 'handleNodeAutomatically' 函数中的空白。或者,或者,告诉我这个计划注定要失败,并告诉我一个更好的方法。
谢谢!
您或许可以在所有三个 class 中都有一个方法,并从 Logic
class:
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)。