2016-12-13 14 views
1

私の教授がuniで私たちに語ったことと、Stroustrupの本で読んだことの間にある程度の混乱がありました。C++のヘッダーと名前空間

  • 我々は、すべてのC++ headerは基本的に 宣言(ファイル.hで定義されている)の集合体であり、彼らは、例えば、クラスの コレクションを含めることができることを知っています。彼らは私たちに、単一のスペースに保存されている機能の 多くを与えるので、彼らは非常に便利です

  • 名前空間は定義せずに、プログラムの一部のクラス、関数、 種類(...)を整理するために考案いろいろ書いていますタイプ。

ここでは、プロジェクトを作成する必要があるときに具体的な違いはありません。


私は様々な程度の方程式を解くプログラムを作成するために(例えば)持っていた場合、私は単一のファイルに必要なクラスを置くところ。たとえば、私はequations.hにすべてのものを入れます:クラスsecondDeg、クラスthirdDeg、クラスfourthDegなど。

なぜ名前空間を使用する必要がありますか?

答えは(私が推測する)より良い組織の名前を与えることができるからです(std :: cinを参照)。しかし、この場合にはI

  1. がequations.h(または任意)を作成する必要があり

は、これは本当にnecassaryですか?名前空間で私のクラスを入れて例えばeqと呼ばれる名前空間

  • を作成しますか。ヘッダーファイルのみを使用して、すべてのクラスを内部に入れることはできませんか?

  • 答えて

    3

    あなたは2つの異なるコンセプトを融合させているようです。ヘッダーはファイルで、通常は宣言を格納するために使用されます。関数宣言、クラス、テンプレートなどを含めることができます。

    名前空間は、宣言されたすべての項目が一意であるスコープを定義する手段です。これにより、標準で名前と衝突する可能性のある関数名やクラス名を使用することができます。たとえば、

    namespace mystuff 
    { 
        class list { }; 
    }; 
    

    リストはstd :: listと競合しません。

    名前空間とである必要があります。その名前空間の一部であるクラスを宣言するためにヘッダーファイルで使用する必要があります。しかし、他の人が指摘しているように、ヘッダーファイルで 'using'ディレクティブを使用することは、名前空間が解決しようとしている名前の競合を引き起こす可能性があるため避けてください。

    +0

    このispiraは私が必要としていた答えです。私は本当に違いがあります。あなたの例では、標準ライブラリに問題がなくてもmystuff :: listを呼び出すことができます。ありがとうございました! –

    6

    これは本当に必然ですか?

    それは依存します。より良い、より明確なオプションは、あなたの宣言をnamespaceに埋め込むことです。

    ヘッダーファイルのみを使用して、すべてのクラスを内部に入れることはできませんか?

    確かにあなたは、単にグローバル(::)スコープで宣言されたシンボルを持つ任意の衝突を避けるためとヘッダファイルにusing namespace <xxx>;を控えることができます。

    +0

    したがって、名前空間はJavaパッケージのようなものですか? –

    +0

    @RaffaeleRossiどういうわけか、はい。 –

    +0

    非常に助かりました、私はそれを考え出したと思います。グローバルスコープのシンボルとの衝突を避けるために、ヘッダーに名前空間を使用しないことをお勧めします。 –

    7

    なぜ名前空間を使用する必要がありますか?

    など

    名前空間には例えば、複数のヘッダを包含することができる。、namespace std<vector><list>から定義を包含する

    あなたはグローバルな名前空間を汚染し、衝突を避けるためないようにnamespace独自に定義することができます。ネームスペースを必要最小限に抑えることは良い習慣です。したがって、一般的にはusing namespace std;は避けてください。