0

このプログラムの高レベルの設計について少し支援が必要です。

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 は、次の 2 つのいずれかになります。

<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 値、または異なるノード名を持つ文字列へのポインターを返します。ポインターの場合は、そのノードへのポインターを取得してから、そのオブジェクトで GetValue を呼び出す必要があります。私が本当にやりたいことは、XML::GetNode(nodename") を呼び出すことですが、これは文脈から外れています。

Node オブジェクトがそのマップにアクセスできるようにする 1 つのアイデアは、XMLfile から派生したクラス Node を作成することです。

class Node: public XMLfile

まだロードされていないため、循環参照が発生します。クラス Node とクラス XMLfile の間で順序を入れ替えると、XMLfile は Node クラス/タイプが何であるかを認識しません。今のところ、これはすべて 1 つの大きなファイルになっていることに注意してください。

誰かがこれをより適切に配置する方法について一般的な提案を提供できる場合は、それをいただければ幸いです。

4

2 に答える 2

0

Nodeaを の特定のケースと考えるのは悪い考えXMLfileです。そのため、一方を他方から派生させないでください。継承とは、A 'is-a' B の関係を意味します。

于 2012-10-11T02:16:18.297 に答える
0

迅速でおそらく汚い解決策:

  1. マップを のパラメータにするGetValue、または
  2. 内部のマップへの (const) 参照またはポインターを格納しますNode
于 2012-10-11T09:27:08.887 に答える