クラスの前方宣言を扱う素敵な本、参考資料を探しています。ソースが複数のディレクトリにある場合。dirA のクラス A は、dirB のクラス B で前方宣言されていますか? これはどのように行われますか?
また、テンプレートの問題、高度な使用法、インスタンス化の問題に関する資料はありますか?
ありがとう。
クラスの前方宣言を扱う素敵な本、参考資料を探しています。ソースが複数のディレクトリにある場合。dirA のクラス A は、dirB のクラス B で前方宣言されていますか? これはどのように行われますか?
また、テンプレートの問題、高度な使用法、インスタンス化の問題に関する資料はありますか?
ありがとう。
前方宣言は、プロジェクトのディレクトリ構造とは関係ありません。プロジェクトに存在しないものでも前方宣言できます。これらは主に、クラス間の循環参照を解決し、完全なクラス宣言が不要な場合にコンパイルを高速化するために使用され、対応する #include を前方宣言に置き換えることができます。
前方宣言で十分かどうかを判断するには、通常、 sizeof() クエリで質問に答えることができます。例えば、
class Wheel;
class Car
{
Wheel wheels[4];
};
この宣言では、コンパイラは Car のサイズを判断できないため、前方宣言は使用できません。つまり、車輪に含まれるデータの量がわからないからです。つまり、sizeof(Car)
不明です。
テンプレートに関しても、テンプレート クラスにテンプレート パラメーターのデータ メンバーが含まれている場合、前方宣言されたクラスをテンプレート パラメーターとして使用することはできません (ただし、それらのポインターは可能です)。例えば、
template<class T> class pointer
{
T *ptr;
};
class Test;
pointer<Test> testpointer;
合法ですが
std::vector<Test> testvector
コンパイルされません。
前述の制限のため、前方宣言されたクラスは通常、ポインターまたは参照として使用されます。
この件に関する本があるかどうかはわかりませんが、c++ faq lite に関するこのセクションを見ることができます。
それらが並列ディレクトリにある場合は、次のように含めることができます
#include "../dirB/B.h"
しかし、ヘッダーでは、前方のデクレレーションのためにこの行を呼び出すだけです
class B;
これの代わりに、インクルードディレクトリとソースディレクトリを分離することができます。
したがって、このディレクトリとしてインクルードディレクトリを表示し、次のように呼び出すことでヘッダーを追加できます。
#include "dirB/B.h"
ヘッダーを前方にデクレレーションするので問題ありません。
一般的に言えば、完全な包含を回避する手段として、または循環参照を有効にする方法として、ヘッダーで前方宣言を行うことができます(悪い)。ポインターまたは参照による前方宣言型、または戻り型のみを使用できます。
JohnLakosによる大規模なC++ソフトウェア設計(書評はこちら)では、物理設計(ファイル)と論理設計、およびそれらがソフトウェアコンポーネント(クラスと常に1:1であるとは限らない)との関係について説明しています。