Так что у меня есть базовый класс, как это:C++ автоматического вывода производных классов
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 с всех атрибутов обоего классов и логическим «isDecisionNode» значением, и только тестом для этого, или перечисления «NODETYPE», но опять же эти методы просто чувствуют бит беспорядочный.
Итак, если вам это нравится, сделайте снимок при заполнении пробелов в функции handleNodeAutomatically. Или, альтернативно, скажите мне, что этот план обречен на провал, и скажите мне, как лучше это сделать.
Спасибо!
Что вы пытаетесь сделать, выглядит как CRTP-шаблон или статический полиморфизм. – ftynse
Звучит как полезная новая концепция ... (googlin «Я пойду ....) – Argh
[wikipedia] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) Это не сделает ваш код менее грязным , хоть. – ftynse