2014-11-08 97 views
0

爲什麼它會在情況1中產生錯誤,但在情況2中不會產生錯誤?做完forward declareion編譯器會以其他方式對待它嗎?我認爲它只是編譯器的一個聲明,用於搜索整個文件的類apple類的前向聲明導致不完整的類型錯誤

// CASE 1 
class apple; // forward declaration 

class fruit{ 
    apple b; // error: incomplete type but why? there is no recursion I guess 
}; 

class apple{ 
    public: int a; 
}; 

int main(){ 
    fruit f; 
    return 0; 
} 

// CASE 2 
class apple{ 
    public: int a; 
}; 

class fruit{ 
    apple b; // no error works fine 
}; 

int main(){ 
    fruit f; 
    return 0; 
} 

請解釋一下。任何幫助是極大的讚賞。

回答

2

轉發聲明必須使用指針。以下應編譯

class fruit{ 
    apple* b; // error: incomplete type but why? there is no recursion I guess 
}; 

其原因是,創建一個類水果時,編譯器需要知道需要多少內存分配爲它的成員。如果它是一個指針,這很容易,32位或64位取決於你的架構。這就是爲什麼前向聲明有效。

如果你試圖在那裏分配一個完整的對象,那麼編譯器需要知道多大的蘋果將爲它保留內存。但由於它只是一個前向聲明,所以它不知道這個尺寸並顯示錯誤

2

在前向聲明之後和定義之前,類fruit確實是一個不完整的類型。

您只能以有限的方式使用它,例如定義指向這些類型的指針或引用,或聲明(但不定義)使用不完整類型作爲參數或返回類型的函數。但是,在您的代碼中,您正在使用fruit類型,而不是指向它的指針或引用,因此它是非法的。