1

私はこのようなことをしました:

struct Vertex {
  list<Edge*> edges;
};

struct Edge {
  Vertex* v1;
  Vertex* v2;
};

およびコンパイラエラー:

「エッジ」はこのスコープで宣言されていません

これら2つを別々のヘッダー「vertex.h」と「edge.h」に入れずにこの問題を解決するにはどうすればよいですか?

4

3 に答える 3

5

を使用する 前に、前方宣言Edgeを使用してください。

struct Edge;

struct Vertex 
{
    list<Edge*> edges;
};

を前方宣言すると、コンパイラは型をIncomplete typeとして扱います。型のレイアウトについては何も認識しませんが、型が存在することだけは認識します。そのため、Incomplete の使用方法にはいくつかの制限があります。タイプ。

よく読んでください:
いつ前方宣言を使用できますか?

于 2012-12-11T05:19:27.467 に答える
1

タイプを前方宣言できます。

struct Vertex;
struct Edge {
   Vertex* v1;
   Vertex* v2;
};

そうは言っても、頂点にエッジのリストを認識させることは、おそらくグラフの良い設計ではありません。複数のグラフで同じ頂点を再利用したい場合はどうすればよいでしょうか? (例として、空港は、さまざまな人々が使用する複数の異なる旅程の合理的な頂点である可能性があります)。

于 2012-12-11T05:19:59.310 に答える
1

型がポインターを介して相互に使用する場合、一方を定義する前に一方を前方宣言できます。たとえば、次のようにします。

struct Vertex;
struct Edge { Vertex* v1; Vertex* v2; };
struct Vertex { list<Edge*> edges; };
于 2012-12-11T05:21:10.310 に答える