5

重複の可能性:
C++ の前方宣言とは何ですか?

この単純な例でコードが何をしているのかについて質問があります。フレンド クラスを調べて、それらがどのように機能するかを理解しましたが、一番上のクラス宣言 (つまり、ロボット) が実際に何をしているのか理解できません。これは、Happy クラスが Robot オブジェクトを使用できるが、そのプライベート パーツにアクセスできないことを意味するだけでしょうか。情報をいただければ幸いです。

#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> >;
  // ...
};
4

4 に答える 4

7

前方宣言です。

という名前のクラス テンプレートRobotが後で定義されること、およびその定義を期待する必要があることをコンパイラに通知するためだけに存在します。

その間 (つまり、Robotが公式に定義されるまで)、プログラマはコード内でその型を参照できます。あなたが与えた例では、クラスのRobotとして宣言する必要があります。(誰がこれらの名前を選んだ?!)friendHappy

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

于 2012-04-13T21:37:53.770 に答える
0

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

于 2012-04-13T21:38:54.473 に答える
0

これは前方宣言と呼ばれます-基本的にコンパイラーに伝えます。「信じてください。後で定義するクラスを使用します」。しかし、コンパイラはロボットのメンバーについて何も知らないので、ロボットへのポインター (または参照) しかない方法でのみ使用できます。

そうしないと、このヘッダーに Robot ヘッダーを含める必要があり、他の循環依存関係につながる可能性があるためです。

于 2012-04-13T21:40:08.543 に答える
0

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

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

于 2012-04-13T21:40:27.280 に答える