2012-01-20 9 views
1

私はクラスNodeと構造体Edgeを持っています。 しかし、構造体がクラスの前に書き込まれると、構造体は距離が分からないと不平を言う。 構造体が後に定義されているときには同じことが言えますが、クラスはEdge(ベクトルの型)が何であるかわからないという不平を言います。同じクラスを含む構造体のベクトルを持つクラス

//This is my header file 

typedef struct Edge Edge; 
struct Edge{ 

    Node node; 
    int distance; 

}; 

class Node 
{ 

    private: 

    std::vector<Edge> vectorOfEdges; 

}; 

このエラーを回避するにはどうすればよいですか? ありがとうございます。

+0

ましたか;'? –

答えて

1

あなたの定義は円形です:NodeEdgeの内側に置き、エッジのベクトルをNodeの内側に入れようとします。これらのうちの1つをポインタにする必要があります。たとえば、次のようになります。

class Node; 
struct Edge{ 
    Node *node; 
    int distance; 
}; 
class Node { 
private: 
    std::vector<Edge> vectorOfEdges; 
}; 

P.S.あなたは構造体の後ろにセミコロンがありませんでした。

+0

申し訳ありませんが、試してみることはできますが、それでもまだ分かります:../src/Node.h:22:エラー:フィールド 'node'に不完全な型があります。 私を助けてくれてありがとう! – inconnu26

+0

@ user1155340私は答えを修正し、更新されたものが動作するかどうかを確認します。 – dasblinkenlight

+0

それは動作します!これは魔法です! – inconnu26

2

文字通りコードをそのままにしたい場合は、これを回避する方法はありません。標準に関する限り、std::vector<T>には文字通りタイプTの要素が含まれている可能性があります。 Edgeはを含み、NodeEdgeを含み、それは意味をなさない。

(実際の言葉遣いが不完全な型のインスタンス化の標準ライブラリコンテナテンプレートは未定義の動作であるということである。)

これを回避する一般的な方法は、あなただけにポインタを提供することにより、PIMPLイディオム、あります要素:

struct Edge; 

class Node 
{ 
    std::unique_ptr<std::vector<Edge>> pVecImpl; 
public: 
    Node() : pVecImpl(::new std::vector<Edge>) { } 
    // ... 
}; 

struct Edge 
{ 
    // as before 
}; 

ハーブサッターのGotW #101はきれいで魅力的な方法で抽象このパターンにきちんとした解決策を説明しています。

(またはあなたも、ポインタにEdge::nodeを作ることができます。) `typedefは構造体のエッジエッジの後ろにあなたの思考は何

関連する問題