Работа с деревьями разных типов узлов - PullRequest
1 голос
/ 26 апреля 2011

У меня есть древовидная структура данных, которая может иметь различные типы узлов, производных от одного TreeBaseNode класса. Я создал узлы дерева типа TreeBaseNode *, которые назначаются объектам разных специальных узлов во время выполнения. Как получить доступ к aNodeAttribute из указателя TreeBaseNode* при создании обхода дерева в дереве (если узел имеет тип SpecialNodeA, который я могу определить по NodeType)

class TreeBaseNode
{
public:
    int NodeType;   
    TypeA commonNodeAttributeA,
    TypeB commonNodeAttributeB; 
};

class SpecialNodeA : public TreeBaseNode
{
private:

    TypeD aNodeAttribute

public:
    SpecialNodeA(int type)
    {
        NodeType = type;
    }
    //Methods   
};

class SpecialNodeB : public TreeBaseNode
{

private:

    TypeE bNodeAttribute;

public:
    //Methods


};

РЕДАКТИРОВАТЬ: изменены типы

Ответы [ 3 ]

4 голосов
/ 26 апреля 2011

В c ++ нет полиморфизма членов-данных предложений, но вы можете использовать полиморфизм функций-членов. Поэтому вы должны объявить virtual int getNodeAttribute(){} в своем базовом классе. И переопределите его в двух производных классах, чтобы вернуть атрибут, что вы хотите.

2 голосов
/ 26 апреля 2011

Альтернативой предложению Мирана будет использование dynamic_cast<> для приведения тех известных вам узлов типа SpecialNodeA из TreeBaseNode в SpecialNodeA, а затем просто вызов соответствующей функции-члена для получения атрибута.вы после.

В этом конкретном сценарии вы даже можете покончить с членом NodeType в базовом классе, так как dynamic_cast<SpecialNodeA> на узле, который не относится к этому типу, просто вернет нольуказатель.Мне не очень нравятся иерархии, в которых базовый класс должен знать свои производные типы, так как это устраняет некоторые преимущества иерархии классов и предполагает, что дизайн не так чист, как должен быть.

0 голосов
/ 26 апреля 2011

Основываясь на дополнительной информации в комментариях, почему бы не добавить общедоступный virtual int estimate() = 0; в базовый класс (при условии, что результатом оценки является int) и переопределить его в производных классах? Т.е. привязать оценочные специализации к специализированным классам. Таким образом, вам не придется иметь дело с полиморфным кодом для извлечения специфических для типа полей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...