2012-12-11 157 views
1

我做了這樣的事情:交叉引用類對象

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

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

和編譯器錯誤:

「邊緣」在此範圍

如何解決未聲明這個問題沒有把這兩個放入單獨的頭文件中,「vertex.h」和「edge.h」?

+1

查找前進的聲明。 – chris

回答

5

使用正向聲明在使用Edge之前。

struct Edge; 

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

注意,當你向前聲明編譯器將類型作爲不完全類型,它不知道類型的佈局什麼,但它只是知道該類型存在,所以,如何使用「未完成」類型有一些限制。

良好閱讀:
When can I use a forward declaration?

1

您可以前瞻性聲明的類型:

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

話雖這麼說,有一個頂點知道其邊緣的名單很可能不是一個很好的設計圖表;如果你想在多個圖表中重複使用同一個頂點? (例如,機場可能是不同人使用的多種不同行程中的合理頂點)。

+0

難道你不能使用shared_ptr頂點嗎?我在這裏看不到你的觀點。 – Chubsdad

+0

這種設計的有效用法是三角測量法。有時你想枚舉毗鄰頂點的edjes。除此之外,如果我們從類中刪除邊緣,那麼頂點根本就沒有成員。 8 - ) –

+0

但是當然,你可以有一個存儲座標的類,而另一個知道相鄰邊的座標。 –

1

如果你的類型通過指針互相使用,你可以在定義另一個類型之前先聲明它們之一。例如像這樣:

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