我做了這樣的事情:交叉引用類對象
struct Vertex {
list<Edge*> edges;
};
struct Edge {
Vertex* v1;
Vertex* v2;
};
和編譯器錯誤:
「邊緣」在此範圍
如何解決未聲明這個問題沒有把這兩個放入單獨的頭文件中,「vertex.h」和「edge.h」?
我做了這樣的事情:交叉引用類對象
struct Vertex {
list<Edge*> edges;
};
struct Edge {
Vertex* v1;
Vertex* v2;
};
和編譯器錯誤:
「邊緣」在此範圍
如何解決未聲明這個問題沒有把這兩個放入單獨的頭文件中,「vertex.h」和「edge.h」?
使用正向聲明在使用Edge
之前。
struct Edge;
struct Vertex
{
list<Edge*> edges;
};
注意,當你向前聲明型編譯器將類型作爲不完全類型,它不知道類型的佈局什麼,但它只是知道該類型存在,所以,如何使用「未完成」類型有一些限制。
您可以前瞻性聲明的類型:
struct Vertex;
struct Edge {
Vertex* v1;
Vertex* v2;
};
話雖這麼說,有一個頂點知道其邊緣的名單很可能不是一個很好的設計圖表;如果你想在多個圖表中重複使用同一個頂點? (例如,機場可能是不同人使用的多種不同行程中的合理頂點)。
難道你不能使用shared_ptr頂點嗎?我在這裏看不到你的觀點。 – Chubsdad
這種設計的有效用法是三角測量法。有時你想枚舉毗鄰頂點的edjes。除此之外,如果我們從類中刪除邊緣,那麼頂點根本就沒有成員。 8 - ) –
但是當然,你可以有一個存儲座標的類,而另一個知道相鄰邊的座標。 –
如果你的類型通過指針互相使用,你可以在定義另一個類型之前先聲明它們之一。例如像這樣:
struct Vertex;
struct Edge { Vertex* v1; Vertex* v2; };
struct Vertex { list<Edge*> edges; };
查找前進的聲明。 – chris