2011-04-04 95 views
11

我知道循環依賴關係,但即使有前向聲明,我也會得到這個區域。 我在做什麼錯?不完整類型結構的使用無效,即使有前向聲明

// facility.h 
class Area; 

class Facility { 
public: 
    Facility(); 
    Area* getAreaThisIn(); 
    void setAreaThisIsIn(Area* area); 
private: 
    Area* __area; 
}; 

// facility.cpp 
#include "facility.h" 
#include "area.h" 
{ ... } 

// area.h 
class Facility; 
class Area { 
public: 
    Area(int ID); 
    int getId(); 

private: 
    std::list<Facility*> _facilities; 
}; 

// area.cpp 
#include "area.h" 
#include "facility.h" 

所以這個編譯罰款,但如果我不

// foo.h 
#include "facility.h" 
class Foo { .. }; 

// foo.cpp 
#include "foo.h" 
void Foo::function() { 
    Facility* f = new Facility(); 
    int id = f->getAreaThisIsIn()->getId(); 

當我invalid use of incomplete type struct Area

+3

您是否在您定義的'Foo :: function()'的任何文件中包含了** area.h **? – 2011-04-04 19:30:40

+0

我修正了'facility.h'中的'getAreaThisIn()'輸入錯誤(應該是'getAreaThisIsIn()')並且修正了g ++(在'Facility'和'Area'方法的存根定義中添加了')它爲我編譯。雖然我的'Foo.cpp'確實包含了兩個頭文件。 – QuantumMechanic 2011-04-04 19:40:36

+3

請注意,以兩個下劃線開頭的標識符(我在看你的'__area')由實現保留,不應使用。 – 2011-04-04 19:41:00

回答

8

Facility* f = new Facility();,你需要一個完整的聲明,而不是向前聲明。

+0

你是什麼意思?我認爲在cpp中包括足夠好? – robev 2011-04-04 19:34:47

+1

@robev包括'facility.h'應該工作得很好,除非有其他錯誤。 – 2011-04-04 19:36:25

+1

@robev - 如果顯示「Foo」類標題及其源文件,事情就會清除。 – Mahesh 2011-04-04 19:36:31

4

你是否在foo.cpp中包含area.h和facility.h(假設這是你得到錯誤的文件)?

+0

不,我必須包含這兩個? – robev 2011-04-04 19:35:16

+3

是的,因爲您在代碼中爲Area和Facility實例調用成員函數,所以您必須。 – 2011-04-04 19:39:21

19

澄清:一個向前聲明允許您在非常有限的方式在對象上進行操作:

struct Foo; // forward declaration 

int bar(Foo* f); // allowed, makes sense in a header file 

Foo* baz(); // allowed 

Foo* f = new Foo(); // not allowed, as the compiler doesn't 
        // know how big a Foo object is 
        // and therefore can't allocate that much 
        // memory and return a pointer to it 

f->quux(); // also not allowed, as the compiler doesn't know 
      // what members Foo has 

正向聲明可以在某些情況下幫助。例如,如果頭部中的函數只接受指向對象的指針而不是對象,則不需要整個頭部的類定義。這可以改善您的編譯時間。但是這個頭文件的實現幾乎可以保證需要相關的定義,因爲你可能想要分配這些對象,調用這些對象的方法等等,並且你需要的不僅僅是一個前向聲明。

相關問題