2011-10-27 9 views
2

この質問は役に立ちましたか?When to use forward declaration?ですが、これは説明的ではありません。C++フォワード宣言を使用すべきですか?

私のシナリオは、通常、クラスメンバーまたは関数の引数のいずれかとして別のクラスへのポインタを使用しているので、ヘッダーに必要なのは前方宣言です(ブーストを使用する場合は、 shared_ptrは前方宣言を使用することと互換性がありますか?)。現在、私はヘッダだけを含んでいますが、前方宣言を使うべきかどうかは疑問です。

私の質問は、クラスの前方宣言を使用できる場合、ですか?私はこの質問が主観的ではないことを期待していますが、ベストプラクティスの答えがない場合、前方宣言の賛否両論は何ですか?ただ、(私は今、それらを使用しますがスイッチを考慮していないよ)のshared_ptrの問題に拡大する

UPDATE

。もし私がそれらを使用するなら、私はクラスの内部でshared_ptr型をtypedef'ingする習慣を使用すると思います。例:

このように思えば、ものすごく混乱するかもしれません。フォワード宣言に問題があるのでしょうか?もしそうなら、簡単な回避策がありますか?

答えて

5

ファイルを含めるとコンパイル時間が長くなりますが、コードケースの数やコードベースの大きさによっては問題になることはほとんどありません。

もう一つ考慮すべきことは、依存関係です。変更したインクルードファイルのためにすべてのコードを再コンパイルする必要はありません。必要なのはポインタ定義だけです。

私の(主観的な)答えはです。はい、あなたはです。

+2

答えを完了するには:はい、 'boost :: shared_ptr'は前方宣言でうまく動作します –

+0

これは速く問題を回避します。はい、間違いなく含むことを前提にしています。 –

1

はい、そうすべきです。ヘッダーに含めるものは、コードのクライアントが使用する場合にも含まれます。ヘッダーに必要なファイルの最小数だけを含めることをお勧めします。それ以外に、ファイル全体を含める必要がなく、前方宣言が適切であれば、単純な選択のように思えます。

-1

通常、可能な限り前方宣言を使用する必要があります。このルールは、すべてのルールと同様、例外があります。例外的なケースは、タイプ名が過度に複雑な場合(すなわち、テンプレート)、名前が多すぎる場合があります。たとえば、次のように前方宣言です:その原料はちょうど#include "MyNiftyStuff.h"を行うことによって回避することができれば

namespace foo 
{ 
    namespace bar 
    { 
     template <typename T1, typename T2, int X> 
     class MyNiftyType; 
     // Hmm, maybe declare more types here? 
    } 
    // Hmm, maybe declare even more types here? 
} 

、私は#include良くしたいです!

ところで、いくつかのストリームタイプの前方宣言を含む標準ヘッダファイル<iosfwd>があります。それは特にあなたがoperator<<(std::ostream&, ...)を宣言することができるように発明されているようです(私の個人的な意見ですが、結局間違っていればごめんなさい)。


編集:shared_ptr<type>に関する。

共有ポインタ(前方宣言型)でできることは、関数を宣言することだけです。 shared_ptr<type>と便利な機能を定義する場合は、typeの順方向宣言だけではできません。例えば:私はshared_ptrするのではなく、通常のポインタを使用した場合

class MyClass; 
void DoMuchStuff(shared_ptr<MyClass> ptr); // declaration - OK 
inline void DoDoubleStuff(shared_ptr<MyClass> ptr) // definition - not OK! 
{ 
    void DoMuchStuff(ptr); 
    void DoMuchStuff(ptr); 
} 

MyCode.h、これは前方宣言で動作します。しかし、この不都合はほとんどあなたに当てはまりません。.hファイルに宣言があるか、またはインライン関数が十分に複雑であるために、あなたのクラスの完全な宣言を#includeにする必要があります。

+2

別のファイルに含まれているときに問題を引き起こす何かを '#include'するまで、トレードオフが速いコンパイルでエラーが発生しにくいコード構造であれば、型名が長いのは誰ですか? –

1

私は、共有ポインタがヒープメモリを掃除の世話をして単なるラッパーであるとして、それは何も変更doesntのその優れた共有ポインタを使用しての質問には (masssiveファイルを含まない)コンパイル速度を向上させるために宣言を前方に使用することを考えて

関連する問題