.cpp ファイルでのインライン メンバー関数の定義: 難題
インライン メンバー関数は通常、コンパイル中に直接組み込むためにヘッダーに配置されますが、特定のシナリオでは、.cpp ファイルでの実装が必要です。このようなケースの 1 つは循環インクルードに関係しており、インライン メンバー関数の実装は .cpp ファイルで定義する必要があります。
循環インクルードのジレンマ
次の例を考えてみましょう。 :
A.h
<code class="cpp">#pragma once #include "B.h" class A { B b; };</code>
B.h
<code class="cpp">#pragma once class A; // forward declaration class B { inline A getA(); };</code>
B.cpp
<code class="cpp">#include "B.h" #include "A.h" inline A B::getA() { return A(); }</code>
この状況では、A.h と B.h 間の循環インクルードにより、インライン メンバー関数 getA() の実装を B.cpp で定義する必要があります。しかし、これは根本的な疑問を引き起こします:
コンパイラーはインライン getA() を適切に実行しますか?
いいえ。コンパイラは、使用時に関数の定義が利用可能な場合にのみ、関数をインライン化します。上の例では、getA() の定義は、他の .cpp ファイルから呼び出されたときに表示されず、リンク中に「未解決の外部」エラーが発生します。
インライン キーワードの重要性
クラス本体の外側 (この場合は B.cpp) の定義に存在する inline キーワードのみが重要です。ヘッダー (B.h 内) の inline キーワードは宣言として機能し、実装が他の場所で提供されることを示します。
.cpp ファイルでインライン メンバー関数を定義するための代替アプローチ
現在、.cpp ファイルでインライン メンバー関数を定義する代替方法はありません。標準では、適切なインライン展開のために、その定義をヘッダーに配置する必要があります。
以上が.cpp ファイルでインライン メンバー関数を定義できますか?循環インクルードとコンパイラの動作を見てみましょう。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。