类层次结构循环 - 高级设计建议

时间:2012-10-11 01:24:43

标签: c++ oop

我需要一点帮助来完成这个程序的高级设计。

我是基于XML描述手动创建类对象的。它具有定义硬件设置的节点。麻烦的是XML中的节点可以简单地指向其他节点。为了能够根据名称快速找到这些节点对象的地址,我使用的是地图。这是简化的视图:

class XMLfile
{
    public:
        Node* GetNode(const string FeatName);   //Searches through "nodes" map to get pointer to     Node
    private:
         map<std::string, Node*> nodes;
};

然后我按如下方式定义节点:

class Node
{
    public:
        virtual int GetValue();
        virtual int Load(XML_type);
};

然后,根据节点的确切“类型”,我创建了一些带有附加变量的派生类。

class Integer: public Node
{
    int IntegerSpecificVar;
    int GetValue();
    int Load(XML_type);
    private:    
       int Value;
       string p_Value;
};

XML可以是以下两种之一:

<Value>5</value>    Which my object load will load 5 into int Value.
or
<p_Value>NodeName</p_Value>  Which my object loader will load the string into p_Value.

根据XML中的对象,GetValue()返回int Value,或指向具有不同节点名的字符串的指针。如果它是一个指针,我需要获取指向该节点的指针,然后在该对象上调用GetValue。我真正想要做的是调用XML :: GetNode(nodename“),但这是脱离了上下文。

让我的Node对象访问该映射的一个想法是创建从XML文件派生的类Node:

class Node: public XMLfile

然后我得到循环引用,因为它还没有加载。如果我在类Node和类XMLfile之间切换顺序,那么XMLfile不知道Node类/类型是什么。请注意,目前这只是一个大文件。

如果有人能提供一般性建议如何更好地安排,我们将不胜感激。

2 个答案:

答案 0 :(得分:0)

Node视为XMLfile的指定案例是不错的主意,因此不要从另一个案例中派生出来。继承意味着 A'的关系是-A'B

答案 1 :(得分:0)

快速且可能很脏的解决方案:

  1. 使地图成为GetValue
  2. 的参数
  3. Node内存储(const)引用或指向地图的指针。