私は、このコンストラクタを見た:"クラス"はコンストラクタで何を意味しますか?
MyClass(class MyOtherClass* = 0) {}
class
キーワードは何を意味するのでしょうか?コンストラクタはポインタMyOtherClass
を受け取り、引数をヌルポインタにデフォルト設定しますか?
私は、このコンストラクタを見た:"クラス"はコンストラクタで何を意味しますか?
MyClass(class MyOtherClass* = 0) {}
class
キーワードは何を意味するのでしょうか?コンストラクタはポインタMyOtherClass
を受け取り、引数をヌルポインタにデフォルト設定しますか?
これは前方宣言です。 MyOtherClass
は、このコンテキストで使用する前に定義する必要はないため、前方宣言で十分です。 =0
が引数のデフォルト値です。あなたは完全な定義を必要としない例
Braindumpの:
を比較以下:
//MyClass.h
class MyClass
{
MyClass(MyOtherClass* = 0) {} //doesn't compile
//doesn't know what MyOtherClass is
};
//MyClass.h
class MyClass
{
MyClass(class MyOtherClass* = 0) {} //compiles, MyOtherClass is declared
};
//MyClass.h
class MyOtherClass; //declare MyOtherClass
class MyClass
{
MyClass(MyOtherClass* = 0) {} //compiles, declaration available
};
ちょうど明確なポイント。 'MyOtherClass'は完全に定義する必要はありません。なぜなら、必要なのはそれへのポインタだからです。 forward-declareは、ポインタを生成するために 'MyOtherClass'について知っておく必要があるすべてのことをコンパイラに伝えます。 –
@JohnDiblingはポインタに限定されません。この場合、それはパラメータなので動作します。オブジェクトメンバの完全な定義は、私が知る限りでのみ必要です(ポインタメンバ、参照、パラメータおよび戻り値の型は完全定義を必要としません)。 –
なぜ 'MyOtherClass'を宣言しているヘッダファイルをインクルードすればいいのですか? – Andreas
うわー!面白い、そのような構文を見たことがありません+1 –
@KirilKirov:しかし、あなたは 'struct tm *'を見ましたか? –
@MatthieuM。 - 絶対に。私はこのコメントを書いている間、正確に同じ考えをしていた:) –