2017-01-06 16 views
2

私の質問は、typedef構造体の包含に関するものです(少なくとも私はそうだと思います)。おそらくばかげているかもしれませんが、私のコードで何が間違っているのか理解できませんでした。C++ - クラス内からのtypedef構造体の包含

私はクラスNodeを宣言Node.hヘッダを持っている:

class Node { 
public: 
    Node(/*some parameters*/); // Class constructor 

    typedef struct{ // This represents a weighted edge of weight "weight" from the current node to another node "node" 
     Node* node; 
     double weight; 
    }EdgeInfo; 

    vector<EdgeInfo*> OutEdges; // This vector represents the outgoing weighted edges from this node 
}; 

だから私はそれはそれは私が」というEdgeInfo宣言することができる唯一の場所だから、私はstructを宣言することができます私のコードで唯一の場所だ考え出しましたNodeクラスオブジェクトが何であるかを知っています。

次に、私はGraph.hヘッダーを持っています。Node.hファイルを含み、Graphクラスを宣言しています。

は、今私は、多かれ少なかれ、このように、Nodeのすべての発信エッジにループ機能を実現していますGraph.cppファイルに:

Node* current = /*passing an object of class Node*/ 

for(EdgeInfo* out : current->OutEdges){   
    /*working on the edges*/ 
} 

問題は、私はコンパイル時に、私はエラーを取得するということですerror: ‘EdgeInfo’ was not declared in this scope、ループはforです。

おそらく私はC++初心者のような人です。 Node.hを含めることで、変数と関数を使用するのと同じ方法で、クラス内で'typedef struct`定義を使用できると思いました。私が間違っている?または、C++での作業の仕組みを理解できませんでしたか?

私は詳細を見逃さないことを願っています。助けてくれてありがとう!

+2

'Node :: EdgeInfo'。しかし、なぜあなたはその時点で 'typedef'を使うのですか?それらはC++では必要ではありません(通常、そのコンテキストで)。 – Zeta

+0

@Zetaなぜですか?代わりにあなたは何をしますか? – jackscorrow

+1

@Tommaso Scarpa C++では、 'struct'または' class'を宣言するためにキーワード 'typedef'を使う必要はありません。それは有効ですが必須ではありません。 'struct'を宣言することができます: 'struct S {int a; }; 'そして、あなたは' struct S'のインスタンスを宣言します: 'S s; sa = 10' – nikau6

答えて

2

だから私はそれはそれは私がいることをEdgeInfoを宣言することができる唯一の場所だから、私は構造体を宣言することができます私のコードで唯一の場所だ考え出した 『知っている』 Nodeクラスのオブジェクトが何であるか。

あなたはforward declarationを使用できます。別のリンク:forward declaration, stackoverflow

class Node; // forward declaration 

struct EdgeInfo 
{ 
    Node* node; // now, `EdgeInfo` knows that a class named `Node` is defined somewhere. 
    double weight; 
}; 

class Node { 
public: 
    Node(/*some parameters*/); // Class constructor 

    vector<EdgeInfo*> OutEdges; // This vector represents the outgoing weighted edges from this node 
}; 

は今、あなたはgraph.cppnode.h、またはGraph.hを含む場合、それはEdgeInfoについて知っておきますよ。

関連する問題