2

ヘッダーファイルに1つのクラスだけを定義し、そのようなクラスを含むヘッダーファイル全体を含めない目的は何ですか?

たとえば、いくつかのヘッダーで、次のようなクラス宣言があることがわかりました。

#include "blabla.h"
#include "mehmeh.h" 
class myClass; 

/*

Some code using myClass 

*/

この種の宣言を使用する目的は何ですか?

4

3 に答える 3

4

これは前方宣言と呼ばれ、その名前の型があることをコンパイラに伝えることができますが、ヘッダー ファイルはその型の詳細を知る必要はありません。

これにより、ヘッダーのインクルードが減り、コンパイル時間が短縮されます。

于 2013-03-06T03:20:25.317 に答える
2

これはクラスの前方宣言です。定義全体を取り込むことなく、定義したクラスへのポインターと参照を定義できます。

これを行う最も重要な理由は、循環参照のために他の方法では実行できない場合です。

class Parent;
class Child {
    Parent *parent;      // Child must reference Parent
    string name;
};
class Parent {
    Child *children[32]; // Parent must reference Children
};

もう 1 つの理由は、コンパイルの高速化です。ポインターを宣言するためだけに大きなヘッダーを含めると、コンパイルが大幅に遅くなる可能性があります。

于 2013-03-06T03:21:53.240 に答える
1

ISO/IEC 14882、1st、3.9.6: 「宣言されているが定義されていないクラス、または未知のサイズまたは不完全な要素型の配列は、不完全に定義されたオブジェクト型です。...サイズとレイアウトの不完全に定義されたオブジェクト タイプのインスタンスは不明です。」

K&R 2nd、p212: 「不完全なタイプのオブジェクトは、[具体的な] サイズが必要ないコンテキストで言及される場合があります。」

不透明なポインター、Cheshire Cat、pimpl など、または逆参照が必要でない、望ましくない、またはおそらく不可能なコンテキストに役立ちます。

于 2013-03-06T18:52:54.593 に答える