簡體   English   中英

為什么前向聲明不適用於類?

[英]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 namespacetypedef 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM