[解決済み] 可能な限りincludeの代わりにforward宣言を使用すべきですか?
2023-03-19 05:12:48
質問
クラス宣言が他のクラスをポインタとしてのみ使用する場合、循環依存性の問題を事前に回避するために、ヘッダーファイルを含める代わりにクラスフォワード宣言を使用することは理にかなっていますか? そのため、代わりに
//file C.h
#include "A.h"
#include "B.h"
class C{
A* a;
B b;
...
};
は、代わりにこれを実行します。
//file C.h
#include "B.h"
class A;
class C{
A* a;
B b;
...
};
//file C.cpp
#include "C.h"
#include "A.h"
...
可能な限りこれを行わない理由はあるのでしょうか?
どのように解決するのですか?
forward-declaration 方式が良い場合がほとんどです。(前方宣言を使用できるファイルを含めることが良いという状況は考えられませんが、念のため常に良いとは言いません)。
クラスを前方宣言することにデメリットはありませんが、不必要にヘッダーを含めることにデメリットがあることは考えられます。
-
を含むすべての翻訳ユニットで、より長いコンパイル時間が必要になります。
C.h
を含むすべての翻訳ユニットにはA.h
も含まれます。 -
間接的に必要ない他のヘッダを含む可能性があります。
-
翻訳ユニットを不要なシンボルで汚染する。
-
もしヘッダが変更されたら、そのヘッダを含むソースファイルを再コンパイルする必要があるかもしれません (@PeterWood)
関連
-
[解決済み】Visual Studio 2015で「非標準の構文。'&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】cc1plus:エラー:g++で認識されないコマンドラインオプション"-std=c++11"
-
[解決済み】なぜ、サイズ8の初期化されていない値を使用するのでしょうか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++でクラスと構造体はいつ使い分けるべきか?
-
[解決済み] フォワード宣言はどのような場合に使用できますか?
-
[解決済み】なぜC++プログラマは'new'の使用を最小限に抑えなければならないのでしょうか?
-
[解決済み】C++のforward宣言とは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】#include<iostream>は存在するのですが、「識別子 "cout "は未定義です」というエラーが出ます。なぜですか?
-
[解決済み] [Solved] インクルードファイルが開けません。'stdio.h' - Visual Studio Community 2017 - C++ Error
-
[解決済み] 数値定数の前にunqualified-idを付けて、数値を定義することを期待する。
-
[解決済み】Eclipse IDEでC++エラー「nullptrはこのスコープで宣言されていません」が発生する件
-
[解決済み] 変数サイズのオブジェクトが初期化されないことがある c++