2009-07-23 13 views
0

私は素敵な本を探しています。クラスの前方宣言を扱う参考資料です。ソースが複数のディレクトリにある場合、例えば。 dirAのクラスAはdirBのクラスBで宣言されていますか?これはどうですか?複数のソースディレクトリの前方宣言。テンプレートのインスタンス化

また、テンプレートの問題、先進的な使用法、およびインスタンシエーションの問題については、どんな素材ですか?

ありがとうございました。

答えて

4

フォワード宣言は、プロジェクトのディレクトリ構造とは関係ありません。プロジェクトに存在していないものを宣言することもできます。ほとんどの場合、クラス間の循環参照を解決し、完全なクラス宣言が不要な場合はコンパイルを高速化し、対応する#includeを前方宣言で置き換えることができます。

前方宣言で十分かどうかを判断するには、通常sizeof()クエリで質問に答えることができます。コンパイラは車のサイズを決定することができないので、例えば、この宣言で

class Wheel; 

class Car 
{ 
    Wheel wheels[4]; 
}; 

は、前方宣言を使用することはできません。それは車輪が含まれているどのくらいのデータを知りません。つまり、sizeof(Car)は不明です。

テンプレートに関しても、テンプレートクラスにテンプレートパラメータのデータメンバーが含まれていても(ただしそのポインタは可能ですが)、フォワード宣言されたクラスはテンプレートパラメータとして使用できません。例えば、

template<class T> class pointer 
{ 
    T *ptr; 
}; 

class Test; 
pointer<Test> testpointer; 

は合法ですが、

std::vector<Test> testvectorはコンパイルされません。

前述の制限のため、前方宣言されたクラスは一般にポインタまたは参照として使用されます。

件名に本があるかどうかわかりませんが、this sectionがC++のfaq liteにあります。

+0

私は "Forward declared classesはテンプレートのパラメータとして使うことはできません"と読むまで、ちょうどこれを+1しようとしていました。これは真実ではありません、あなたが意味するものの例を与えることができますか?私たちはあなたが本当にそれを意味するように、その文をそれらの言葉で表現することができます。前方宣言されたクラスは、ポインタだけでなく参照も可能です。 –

+0

リチャード、応答のおかげで、私は急いでいたと明らかにいくつかの点を逃した。テンプレートのパラメータについて私が言ったことは間違っていて、私は参考文献を忘れていました。 –

1

彼らはあなたが

#include "../dirB/B.h" 

のようにそれを含めることができますが、ヘッダにあなただけの楽しみdeclerationのためにこれに代えて

class B; 

をこの行を呼び出す並列ディレクトリ内にある場合、あなたは区切ることができますインクルードディレクトリとソースディレクトリ。

ので、あなたは、このディレクトリとしてディレクトリを含めると、あなたがヘッダ上の前方declerationを行いますから、それは問題では文句を言わない

#include "dirB/B.h" 

を呼び出すことで、ヘッダを追加することができます表示することができます。

+1

含まれていません。 –

+0

私のクラスBがdirBにあり、私が前方宣言をしていてインクルードしていない場合、それが定義されている場所を見るコンパイラの仕事ですか? プロジェクトが非常に大きい場合、2つのクラスが同じ名前を持つ可能性はありますか?この場合はどうなりますか? –

+0

前方宣言は「このタイプがありますが、まだ定義していません」という意味です。それを調べようとはしません。同じスコープ内に2つの同じ名前の型がある場合は、コンパイルエラーが発生します。 – CiscoIPPhone

1

一般的に言えば、完全なインクルードを回避する方法として、または循環参照を有効にする方法(悪い方法)としてヘッダーで宣言することができます。 前方宣言型は、ポインタ型、参照型、または戻り型のみで使用できます。

John Lakosの大規模なC++ソフトウェアデザイン(book review here)は、物理設計(ファイル)と論理設計、およびそれらがソフトウェアコンポーネント(どのようにクラスで常に1:1であるとは限りません)に関連するかを扱います。

関連する問題