3
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のない構造体定義はタグ名前空間に行くことを私は知っています。

構造体は、すべてのパブリックメンバーによる単なるクラスです。ですから、私は彼らが同じように振る舞うことを期待しています。

4

4 に答える 4

9

前方宣言はクラスに対して機能しますが、それ以外は期待どおりです。まず、ルーチンclass B;のコードの前に書く必要があります。次に、の代わりにmain書く必要があります。タイプ B のオブジェクトは、クラスの定義後にのみ作成できます。B * bb;B bb;

この動作の理由は次のとおりです。コンパイラは、クラス B のインスタンスのスタックに割り当てなければならないバイト数を認識していません。この情報は、クラスの定義 (その時点で指定していない) に依存するためです。 )。ただし、クラス B のインスタンスへのポインターは、B の前方宣言の後に構築できます。これは、ポインターのサイズが事前にわかっているためです (通常、すべてのポインター型で同じです)。

于 2010-04-16T06:21:38.337 に答える
4

クラス前方宣言は正常に機能します。あなたはただそれを含めなかった。追加

class B;

bb宣言の上にあり、それは機能します

編集:キビブが指摘したように、それがポインタでない限り、不完全な型を宣言することはできないので、

B* bb;

うまくいくでしょうが、あなたのやり方はうまくいきません。グッドコール

于 2010-04-16T04:43:04.937 に答える
1

「struct t tt;」という行はないと思います。コンパイルします。

C++ では、デフォルトのアクセス権限が異なることを除けば、struct と class は同じです。

于 2010-04-16T04:55:58.110 に答える
1

あなたの行:

struct t tt;

私のためにコンパイルしません、私は得ます:

.\TestApp.cpp(11) : error C2079: 'tt' uses undefined struct 'main::t'

(これは Visual C++ 2008 です)

于 2010-04-16T05:01:44.867 に答える