2015-02-22 3 views
1

Так что у меня есть базовый класс, как это: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. Или, альтернативно, скажите мне, что этот план обречен на провал, и скажите мне, как лучше это сделать.

Спасибо!

+1

Что вы пытаетесь сделать, выглядит как CRTP-шаблон или статический полиморфизм. – ftynse

+0

Звучит как полезная новая концепция ... (googlin «Я пойду ....) – Argh

+0

[wikipedia] (http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) Это не сделает ваш код менее грязным , хоть. – ftynse

ответ

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(); 
    } 
}; 

Примечание: Приведи на комментарии ниже (by @BasileStarynkevitch и @ChristianHackl) для некоторых технических деталей.

+0

Я считаю, что 'foo' часто должен быть' virtual' внутри 'BaseNode' –

+0

Да ... выглядит неплохо, когда вы так выразились ...по какой-то причине я не помню, я не думаю, что хочу это сделать, хотя ... – Argh

+0

@BasileStarynkevitch Да, спасибо, я исправлю это. – jadhachem

Смежные вопросы