1

ここに、Node と DobleNode の 2 つのクラスがあります。どちらも別の .h ファイルにあり、どちらも独自の .cpp ファイルを持っています。

//"Node.h" 

class Node
{
public:

    Node(string pName, string pID);
    void setReferencia(DobleNode *pReferencia);
    DobleNode* getReferencia(void);

private:

    string Name;
    string ID;
    DobleNode *referencia;
};

//"DobleNode.h"

class DobleNode
{
public:

    DobleNode(string pBank_code, string pCard_type);
    void setReferencia(Node *pReferencia);
    Node* getReferencia(void);

private:

    string bank_code;
    string card_type;
    Node *referencia;
};

問題は、参照が必要なことです。Node クラスには DobleNode タイプの属性が必要であり、DobleNode クラスには Node タイプの属性が必要です。「Node.h」の前に「DobleNode.h」を含めるだけで、すべてが機能します...

しかし、これを行うと、後で小さなプログラムをコンパイルしようとすると、識別子 Node が存在しないと表示されます。逆に言えば同じことを言っているのですが、今回は DobleNode という識別子が存在しないということです。

これを解決するにはどうすればよいですか。解決策は両方のクラスを同じファイルに入れることだと思いますが、これを解決するより良い方法があると本当に思います。「Node.h」と「DobleNode.h」の両方を同時にチェックするようにコンパイラに「指示」する方法はありますか?

ご回答有難うございます。

ところで、私はVisual Studio 2010 Professional、C ++(明らかに)に取り組んでいます。

4

3 に答える 3

5

ポインターを使用しているため、クラスを前方宣言できます。

//"DobleNode.h"

class Node;   // DECLARED!  "Node.h" doesn't need to be included.

class DobleNode
{
    ...

//"Node.h" 

class DobleNode;   // DECLARED!  "DobleNode.h" doesn't need to be included.

class Node
{
    ...
于 2013-03-28T23:04:33.063 に答える
2

「class Node;」と入れてください。および「クラス DobleNode;」一方または両方のヘッダーの上部。

例 (構造体を使用)

struct node1;
struct node2;

struct node1 { struct node2 *p; };
struct node2 { struct node1 *p; };

クラスでも同じように機能します。

于 2013-03-28T23:04:07.720 に答える
1

2 つのファイルが互いにインクルードすると、無限循環インクルージョンが発生するため、問題が発生しています。これを回避するために、コードには既に含まれているコードを含めないように指示するプリコンパイラ ヘッダーが含まれている可能性があります。ただし、これにより、クラスの1つに他のクラスが定義されていません

解決策は 2 つあります。Drew Dormann によって説明されているように、前方宣言できます。

ただし、それぞれに似たようなメソッドがあるように見えるため、 Node と DoubleNode の両方が継承する仮想クラスを使用する方が適していると思います。これにより、一般的なメソッドのコードを複製する必要がなくなり、編集が容易になります。

例えば

//"Node.h" 

class Node : public NodeBase
{
public:

private:

    string Name;
    string ID;
};

//"DobleNode.h"

class DobleNode : public NodeBase
{
public:

private:

    string bank_code;
    string card_type;
};

//"NodeBase.h" 

class NodeBase
{
public:

    Node(string pName, string pID);
    void setReferencia(NodeBase *pReferencia);
    NodeBase* getReferencia(void);

protected:
    NodeBase *referencia;
};
于 2013-03-28T23:10:48.087 に答える