2013-05-31 53 views
7

clangコンパイラを使用したC++のForward Declarationに関する問題があります。ここに私のコードです。これは、CReferenceメンバのデータを不完全型として指し示します。完全な宣言がC++でのクラスの前方宣言、不完全型

+0

ここでは前方宣言は使用できません。 'CReference'は' Internal'の完全な宣言が必要です。 – juanchopanza

+0

宣言を転送する場合は、 'Internal'へのポインタを使うべきです。 – user1520427

+1

[フォワード宣言を使用するタイミングは?](http://stackoverflow.com/questions/553682/when-to-use-forward-declaration) – juanchopanza

答えて

3

前方宣言は、コンパイラは、タイプの完全な定義を必要としないとき、あなたはそれへのポインタと参照を使用することができます。つまり、Internal data;Internal* dataまたはInternal& dataに変更すると正常に機能します。

Internal data;を使用すると、CReferenceクラスの構造を作成できるように、コンパイラはIntrenalという全体の定義を知る必要があります。

15

前方宣言が有用で使用可能になるまで 助けてください

class Internal; 

class CReference { 
private: 
    Internal data; 
public: 

    CReference() {}  
    ~CReference(){} 
}; 

class Internal { 
public: 
    Internal() {} 
    ~Internal() {} 
}; 
+0

ほぼ完璧な答えです。残されているのは、彼がCReferenceの上のInternalの定義を動かすことができ、それがうまくいくということです。 –

+0

@RickYorgason - もちろん、私はOPが、class internalについて 'class CReference'を"知る "必要がないので、明らかに見えると思います。 –

1

タイプをクラスのメンバーとして使用するには、クラスのサイズを正しく計算できるように、コンパイラーはそのサイズを知る必要があります。前方宣言はその情報を提供しません(C++は先読みして検索しようとはしません。特にボディが別の翻訳単位で宣言される可能性があるためです)ので、それを価値のあるメンバーとして使用することはできません。

ポインタと参照は、それらが参照する型に関係なく同じサイズであるため、代わりにポインタまたは参照を使用します。その後、コンパイラは操作を開始するとその型のサイズを知る必要があります。

0

上記のとおりです。前方宣言では、ヘッダーファイル内のヘッダーを避けるために、ヘッダのクラスのプレーンポインタのみを使用することがあります。

通常、インクルードはできるだけ少ない数のヘッダーファイルに保存します。 クラスを前方宣言することによって達成できますが、ネストされたクラスでなく、ポインタがヘッダーで使用されている場合に限ります。ポインタサイズは前方宣言によって提供される必要な情報です。

関連する問題