web-dev-qa-db-ja.com

構造体とクラスの宣言を転送

struct Bookではなくclass Bookとして誤って宣言された、クラスのC++前方宣言に誤りを見つけました。 Bookは以前は構造体でしたが、クラスに変更されたと思いますが、前方宣言は残りました。

Book.h:

class Book {
    ...
};

Library.h:

struct Book;

class Library {
    std::vector<Book*> books;
};

コンパイラの警告はなく、結果のプログラムは正常に動作するように見えました。それは私を不思議に思いました:理論的には、これは問題を引き起こす可能性がありますか?これは単なるポインタです、はい、たとえば、クラスに仮想メソッド、多重継承があった場合、ポインタは異なる可能性がありますか?

デフォルトのパブリック/プライベートに関するクラス/構造体の違いを知っていますが、フォワード宣言とそれらをスワップすることの考えられる結果について具体的に尋ねています。

17
Tomas Andrle

structclassは、前方宣言に関する限り、完全に交換可能です。定義の場合でも、それらはオブジェクトメンバーのデフォルトのアクセス指定子にのみ影響し、その他はすべて同等です。常にオブジェクトの「クラス」を定義します。

structclassに対して使用する必要がある唯一の場所は、 c バインディングの不透明なデータを前方宣言する場合です。


あなたの編集について:

デフォルトのパブリック/プライベートに関するクラス/構造体の違いは知っていますが、フォワード宣言とそれらをスワップすることの考えられる結果について具体的に尋ねています。

Visual C++は警告 C4099 を生成します。これは、その機能の名前の装飾に、使用したキーワードが組み込まれているためです。したがって、プログラムmayは正しくリンクできません。そのため、VC++を使用すると、完全に標準に準拠したコードがリンクされない可能性があります(Microsoft側の骨頭の動き、AFAIC)。

この警告の説明と、懲戒処分を受けた場合に無視できる理由については、 here を参照してください。