1. ホーム
  2. c++

[解決済み】C++ - ネストされたインクルード - 「インクルードが深すぎてエラーになる」ことの回避

2022-02-12 03:33:29

質問内容

C++のコードで次のような接続をしたい場合、ヘッダーファイルの宣言はどのようにすればよいですか? インクルードが深すぎてネストしているエラー」。 ?

私のエッジクラスでは、Nodeオブジェクトを返す必要がある関数がいくつかあります。Edgeクラスにも同じように、Nodeオブジェクトを返す必要がある関数があります。しかし、コンパイラは、このネストされたループを持つことを許可していません。

Node.h

#ifndef _NODE_h__
#define __NODE_h__

#include "Edge.h" 
public:
    Node();
    ~Node();
    void setName(string);
    string getName();
    void addEdge(Edge*);
    vector<Edge* > getEdges() { return _edges; };
};
#endif

エッジ.h

#ifndef _EDGE_h__
#define __EDGE_h__

#include "Node.h"
class Edge 
{
public:

    Edge();
    Edge(bool);
    ~Edge();
    bool hasBeenSeen() { return _seen; };
    void reset() { _seen = false; };  // resets seen param to false
    Node* getSource() { return _source; };
    Node* getTarget() { return _target; };
    void setSource(Node* source) { _source = source; };
    void setTarget(Node* target) { _target = target; };
};
#endif

解決方法は?

他の人が提案したように、ヘッダーガードを使用します。しかし、問題のクラスを前方に宣言することも試してみてください。また、少なくとも1つのクラスで(値ではなく)ポインタを扱う必要があるかもしれませんが、コードを見なければわかりません。

ということで、edge.hは以下のような感じでいいと思います。

#ifndef EDGE_H
#define EDGE_H

class Node;    // forward declaration

Node functionB();

#endif

なお、このとき 定義 この関数は、別のC++ファイルに記述して、"node.h"をインクルードしてください。

もし、これらのことが非常に複雑に思えるのであれば、設計を簡素化してみてください。ノードとエッジが互いのことを知る必要はないでしょう。一方通行の依存関係で十分です。

最後に、ダブルアンダースコアを含む名前はC++で予約されています。