2012-04-13 11 views
4

可能性の重複:
What is forward declaration in c++?ヘッダーファイルに空のクラス宣言がありますか?

私は、コードの一部は、この単純な例ではやっていることについて質問があります。私は友人のクラスを探し、その動作を理解していますが、実際にトップクラスの宣言(つまりロボット)が何を理解していません。ハッピークラスはロボットオブジェクトを使用できますが、プライベートパーツにアクセスすることはできません。情報があればわかります。

#include <stdlib.h> 
#include <stdexcept> 

template <typename T> // What is this called when included 
class Robot;   // is there a special name for defining a class in this way 

template <typename T> 
class Happy 
{ 
    friend class Joe<T>; 
    friend class Robot<Happy<T> >; 
    // ... 
}; 
+0

http://stackoverflow.com/questions/4926105/what-is-forward-declaration-in-c – mydogisbox

答えて

4

それは、前方宣言です。

Robotという名前のクラステンプレートが後で定義され、その定義が必要であることをコンパイラに知らせるだけです。

一方、Robotが正式に定義されるまで、プログラマーはコード内のそのタイプを参照することができます。あなたが指定した例では、RobotHappyクラスのfriendとして宣言する必要があります。 (誰がこれらの名前を選んだのですか?)

循環依存性を回避し、コンパイル時間/オーバーヘッドを最小化するのが一般的な戦略です。

+0

+1、公用語はただの宣言であっても、一般的な用語は*前方宣言*です。 。 * forward *は通常、宣言だけでなく宣言*(これも*宣言*)を扱っていることを明示するために追加されています –

+0

名前を選んだhaha – Ockham

+0

私は、クラスBヘッダファイルのクラスAの前方宣言。私は前方宣言をコメントして、代わりにクラス 'A'のヘッダーファイルをインポートし、同じように動作するように見えることに気付きました。 どちらか一方を使用する理由はありますか? – Gonzalo

0

これは基本的にコードの残りの部分に「これを使うことができますが、後で宣言します」と言います。 その行がないと、このコードはコンパイルされません。 friend class Robot<Happy<T> >;

0

これは基本的にコンパイラに伝えられます。 「信頼してください、私は後で定義するクラスを使用します。しかし、コンパイラはロボットのメンバーについて何も知らないので、ここにポインタ(または参照)しかないところでしか使用できません。

そうでないと、このヘッダーにRobotヘッダーを含めて、他の循環依存性を引き起こす可能性があるからです。

0

これは「前方宣言」と呼ばれています。コンパイラには「Robotというクラスがありますが、それはどのようなものかは説明していませんが、存在することに注意してください」と伝えています。このようにして、Happyの定義内にRobotを使用すると、コンパイラは "未定義の識別子"エラーをスローしません。あなたはまだどこかでRobotの完全な定義を含める必要があります。そうしないと、リンカエラーが発生します。

通常、オブジェクトが.hファイルのさらに遠くに定義されたものを参照する必要がある場合、または2つのオブジェクトが互いに参照する必要がある場合に、これが使用されます。

関連する問題