ヘッダーファイルに1つのクラスだけを定義し、そのようなクラスを含むヘッダーファイル全体を含めない目的は何ですか?
たとえば、いくつかのヘッダーで、次のようなクラス宣言があることがわかりました。
#include "blabla.h"
#include "mehmeh.h"
class myClass;
/*
Some code using myClass
*/
この種の宣言を使用する目的は何ですか?
ヘッダーファイルに1つのクラスだけを定義し、そのようなクラスを含むヘッダーファイル全体を含めない目的は何ですか?
たとえば、いくつかのヘッダーで、次のようなクラス宣言があることがわかりました。
#include "blabla.h"
#include "mehmeh.h"
class myClass;
/*
Some code using myClass
*/
この種の宣言を使用する目的は何ですか?
これは前方宣言と呼ばれ、その名前の型があることをコンパイラに伝えることができますが、ヘッダー ファイルはその型の詳細を知る必要はありません。
これにより、ヘッダーのインクルードが減り、コンパイル時間が短縮されます。
これはクラスの前方宣言です。定義全体を取り込むことなく、定義したクラスへのポインターと参照を定義できます。
これを行う最も重要な理由は、循環参照のために他の方法では実行できない場合です。
class Parent;
class Child {
Parent *parent; // Child must reference Parent
string name;
};
class Parent {
Child *children[32]; // Parent must reference Children
};
もう 1 つの理由は、コンパイルの高速化です。ポインターを宣言するためだけに大きなヘッダーを含めると、コンパイルが大幅に遅くなる可能性があります。
ISO/IEC 14882、1st、3.9.6: 「宣言されているが定義されていないクラス、または未知のサイズまたは不完全な要素型の配列は、不完全に定義されたオブジェクト型です。...サイズとレイアウトの不完全に定義されたオブジェクト タイプのインスタンスは不明です。」
K&R 2nd、p212: 「不完全なタイプのオブジェクトは、[具体的な] サイズが必要ないコンテキストで言及される場合があります。」
不透明なポインター、Cheshire Cat、pimpl など、または逆参照が必要でない、望ましくない、またはおそらく不可能なコンテキストに役立ちます。