以下で説明する前方宣言は、ElaboratedTypeSpecifierの兆候の1つです。
C ++やObjective-Cなどの一部のオブジェクト指向言語では、クラスを前方宣言する必要がある場合があります。これは、クラスの名前が型であることを知る必要があるが、構造を知る必要がない状況で行われます。
C ++では、クラスと構造体は次のように前方宣言できます。
class MyClass;
struct MyStruct;
C ++では、そのクラスへのポインター型のみを使用する必要がある場合は、クラスを前方宣言できます(すべてのオブジェクトポインターは同じサイズであり、これがコンパイラーが気にするものであるため)。これは、クラス定義内で特に役立ちます。たとえば、クラスに別のクラスへのポインタ(または参照)であるメンバーが含まれている場合です。
前方宣言は、ヘッダーを含める回数を減らすことでコンパイル時間を短縮するのに役立つ不要な結合を回避するために使用されます。これには3つの利点があります。
- によって開かれるファイルの数を減らす
#include
(したがって、オペレーティングシステムの呼び出しの数)
- 前処理されたファイルの量を減らす(ヘッダーが含まれていないため)
- 前方宣言されたクラスが変更されたときの再コンパイルの影響を減らします。
実際のクラス型を使用する必要がある場合、たとえば、型が直接(ポインタではない)そのクラスであるメンバーがある場合、またはそれを基本クラスとして使用する必要がある場合、クラスの前方宣言は十分ではありません。または、メソッドでクラスのメソッドを使用する必要がある場合。
これにより、関連するヘッダーファイルをヘッダーファイルにインクルードすることなく、タイプへのポインターを使用できます(代わりに、.cppファイルにのみ必要です)。
これは、依存関係を減らし、コンパイル時間を改善するのに役立ちます。
Unreal Engine
特にコアクラスはとにかく含まれていることが多いため、必ずしも必要なわけではありません。ただし、ヘッダーファイルを明示的にインクルードしていない場合は、プレフィックスを使用することをお勧めします。これを行う場合、ヘッダーを含んでいたファイルがそれを含まないように変更されても、コードはコンパイルされます。
前方宣言は適切ですが、ETSは避ける必要があります。型を前方宣言する場合は、ファイルスコープで明示的に宣言するのが最善です。
悪い:
class Bad
{
void Func(class Y* YParam);
class Z* ZProp;
};
良い:
class Y;
class Z;
class Good
{
void Func(Y* YParam);
Z* ZProp;
};