2012-05-06 7 views
5

フォワード宣言を使用することができますか使用できないのかはっきりしていますが、まだ1つのことについてはわかりません。フォワード宣言/ヘッダーを含めるのが最善の場合?

..さんは、私は私がそれのような何かをするより効率的なのかどうかについては明らかではないよクラスA のオブジェクトを参照に解除するために、遅かれ早かれヘッダーを含める必要があることを知っているとしましょう

class A; 
class B 
{ 
    A* a; 
    void DoSomethingWithA(); 
}; 
cppの中

、その後は...のような

#include "A.hpp" 
void B::DoSomethingWithA() 
{ 
    a->FunctionOfA(); 
} 

を何かを持っているか、私もちょうど最初の場所でBのヘッダ・ファイル内のAのヘッダが含まれるのでしょうか? 前者がより効率的であれば、なぜ誰かがそれが私がいつももっと学ぶことでできるコンパイルプロセスと関係があると思われる理由が明らかに説明されたら、それを感謝します。

答えて

11

利用前方宣言可能な限り(あなたの例のように)。これによりコンパイル時間が短縮されますが、実装の詳細を気にする必要がなく、実装の詳細を気にしないコードのヘッダーとライブラリの依存関係が最小限に抑えられます。一般に、実際の実装以外のコードは実装の詳細を気にする必要はありません。ここで

は、この上のGoogleの根拠である:GoogleのC++スタイルガイド用Header File Dependencies

+0

+1答えるため – LihO

+0

歓声、そしてそれは偉大な読み取りのおかげだろうようにグーグルのスタイルガイドが見えます! – Holly

+8

私はこのスレッドが古いことを知っていますが、他の人が理論的根拠を探す場合には、ちょっとだけ指摘しておかなければならないと思うのですが、Googleの理論的根拠が "可能な限り前方宣言を避けてください。 " – soulsabr

0

コンパイルを効率的に実行しようとしないでください。ドラゴンがいる。 A.hppB.hppに含めてください。

CおよびC++ヘッダーファイル用の標準​​的な方法は、それが一度だけコンパイルされていることを確認するための#ifdefのヘッダファイルのすべてをラップすることです:

#ifdef _A_HPP_ 
#define _A_HPP_ 

// all your definitions 

#endif 

そのように、あなたB.hpp#include "A.hpp"場合、両方を含むプログラムを持つことができます。何も定義しないため、ブレークしません。

4

明示的宣言を使用すると、明示的にと表示されます。「クラスBはクラスAの内部実装について何も知る必要はなく、Aクラスが存在することを知るだけでよい」そのヘッダーを含めるのを避けることができれば、それを避けてください。 - フォワード宣言を使用することで冗長な依存関係を排除するので、代わりにフォワード宣言を使用することをお勧めします。

また、ヘッダーファイルを変更すると、ヘッダーファイルを含むすべてのファイルが再コンパイルされます。また、あなたを助ける

これらの質問:
What are the drawbacks of forward declaration?
What is the purpose of forward declaration?

関連する問題