[英]Why does forward declaration not work with classes?
int main() {
B bb; //does not compile (neither does class B bb;)
C cc; //does not compile
struct t tt; //compiles
class B {}; //HERE is the class B defination
struct s { struct t * pt; }; //compiles
struct t { struct s * ps; };
return 0;
}
class C {};
我剛修改了這里給出的例子。
為什么結構轉發聲明有效,而不是類前向聲明?
它是否與命名空間有關 - tag namespace
和typedef namespace
? 我知道沒有typedef的結構定義會轉到標記命名空間。
結構只是包含所有公共成員的類。 所以,我希望他們的行為類似。
前向聲明適用於類,但其他時候你已經預期。 首先,你必須寫class B;
在你的main
的代碼之前。 然后你必須寫B * bb;
而不是B bb;
。 只能在類定義之后構造B類型的對象。
此行為的原因如下:編譯器不知道它必須在堆棧上為B類實例分配多少字節,因為此信息取決於類的定義(當時您沒有給出)。 然而,可以在B的前向聲明之后構造指向類B的實例的指針,因為指針的大小是先前已知的(並且對於所有指針類型通常是相同的)。
班級前瞻性聲明工作正常; 你只是沒有包括一個。 加
class B;
在bb
聲明之上它會起作用
編輯:正如kibibu指出的那樣,你不能聲明一個不完整的類型,除非它是一個指針,所以
B* bb;
會工作,但你的方式不會。 好決定
我不認為這行“struct t tt;” 將編譯。
在C ++中,struct和class是相同的,除了具有不同的默認訪問權限。
你的路線:
struct t tt;
不編譯給我,我得到:
.\TestApp.cpp(11) : error C2079: 'tt' uses undefined struct 'main::t'
(這是Visual C ++ 2008)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.