2010-12-06 77 views
2

成員,我有一類稱爲邊緣和一個叫頂點C++編譯器錯誤類沒有名爲

在我的邊緣類類有一個頂點的引用稱爲目標。在頂點我發送一個邊緣,並嘗試通過邊緣改變目標,但我有一個類的編譯器錯誤邊緣沒有成員命名目標。

我Edge.h是

#include "Vertex.h" 

class Edge 
{ 
    public: 
    Edge *data; 
    Edge *next; 
    Vertex *target; 

    Edge(); 
    Edge(Edge *x); 
    Edge(Vertex *x); 

    void print(); 

}; 

錯誤是由該代碼Vertex.cpp

Vertex::Vertex(Edge *x) 
{ 
    name = x->target->name; 
    next = x->target->next; 
    mark = x->target->mark; 
    previous = NULL; 
    next = NULL; 
} 

確切的錯誤造成的,當我試圖編譯頂點

g++ -g -I. -c -o Vertex.o Vertex.cpp 
In file included from Vertex.h:3, 
       from Vertex.cpp:3: 
Edge.h:10: error: ISO C++ forbids declaration of ‘Vertex’ with no type 
Edge.h:10: error: expected ‘;’ before ‘*’ token 
Edge.h:14: error: expected ‘)’ before ‘*’ token 
Vertex.cpp: In constructor ‘Vertex::Vertex(Edge*)’: 
Vertex.cpp:26: error: ‘class Edge’ has no member named ‘target’ 
Vertex.cpp:27: error: ‘class Edge’ has no member named ‘target’ 
Vertex.cpp:28: error: ‘class Edge’ has no member named ‘target’ 
+2

如果在Edge.cpp中聲明瞭Edge,則該聲明將不可用於Vertex.cpp。 – Will 2010-12-06 05:00:58

+0

你有沒有在Vertex.cpp中引入Edge.h?錯誤可能是「邊緣沒有名爲目標的成員,因爲類型尚未定義」只是有刺。 – Seth 2010-12-06 05:06:42

回答

1

如果我正確地理解了這種情況,看起來你有.cpp中的Edge類聲明,而不是.h(我是什麼然後呢?)。 Vertex中出現的錯誤是因爲當編譯器查找Edge類時,它無法在Edge標題中找到聲明 - 換句話說,它是隱藏的。你的Edge類聲明應該在頭文件中,並且定義應該在.cpp中。還要注意,這是循環依賴的一個很好的例子,通常會導致痛苦。看看你是否不能打破它們。

編輯:謝謝你把確切的錯誤放在那裏,它幾乎證實我們所有的猜測。確保兩個類都可以看到對方 - 確保Vertex包含Edge的標題。如果這些類足夠小,您可能希望將它們都轉儲到一個文件中,如Falmarri所建議的那樣。此外,不要忘記使用forward declarations來解決這些類型的循環依賴。如果您在類中包含指向外部類的指針或引用,則可以轉發聲明,但它不適用於類中的實際對象(如Edge edge;)。我相信這樣做的原因是指針和引用只是地址,所以編譯器不需要知道內部信息,但是要使用實際的對象,你必須知道里面的內容。

0

將Edge聲明放在Edge.h中,並在Vertex.cpp中包含Edge.h。

0

似乎你有循環依賴。您可以在Edge聲明中的未聲明類名稱(例如class Vertex *target;)之前添加class以解決此問題。

1

所有其他答案正確地解釋了你在兩個類之間的循環依賴關係有問題並解釋如何解決它。

我的建議是讓頂點類不知道Edge類。只需將getTargetVertex()和getSourceVertex()方法添加到邊類並僅使用Vertex類中的複製構造函數即可。

當然,這個解決方案將很難知道在沒有檢查可用池/邊緣列表中的每個邊緣實例的情況下,哪些邊緣定位到頂點。