- ベストアンサー
名前空間とヘッダーファイル
名前空間とヘッダーファイルの違いがいまいち わからないのですが? なんで二つあるんです? どっちかひとつでよくないですか? っていうか考え違いしてます? ちょっと分かりやすくどなたか整理して教えてくださいませんかね?
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
名前空間とヘッダファイルは全く違います。 おそらく考え違いしているものと思われます。 思い切りわかりやすく説明すると(逆にわかりにくくなってしまったらごめんなさい)、 名前空間はクラスをグループ化するものです。グループ化することによってクラス名が同一であっても別グループであれば区別することができます。 ヘッダファイルはcppファイルの中身を別のcppファイルに公開するものです。ヘッダファイルがあることによって、あるcppファイル内のクラスや関数を別のcppファイルから利用できます。 例えばsample.hというヘッダファイルを作ります。 この中身は以下の様だとします。 #ifndef __SAMPLE_H__ #include <iostream> namespace nsp1{ class samplecls{ public: void print(){ std::cout << "nsp1::samplecls" << std::endl; } }; }; namespace nsp2{ class samplecls{ public: void print(){ std::cout << "nsp2::samplecls" << std::endl; } }; }; #endif // __SAMPLE_H__ cppファイル側は以下のようにします。 #include <stdio.h> #include "sample.h" int main(int argc, char* argv) { nsp1::samplecls cls1; cls1.print(); nsp2::samplecls cls2; cls2.print(); return 0; } 同じクラス名が同一名前空間にあるとエラーが発生しますが、 名前空間を別にすることで同じクラス名を定義できています。 従ってヘッダファイルによって名前空間を代用することはできないし、名前空間によってヘッダファイルを代用することはできません。
その他の回答 (3)
- MrBan
- ベストアンサー率53% (331/615)
Cとの互換性でこうなっているというのが大きな理由と思いますが、用法/考え方としては、 ヘッダファイルはファイル構成の問題で、名前空間は論理構成の問題。 設計上「クラスをどう分類/整理するか」が名前空間で、 管理上「クラスをどう配置するか」がヘッダファイル、ですかね。 通常は、設計した単位で分割して管理(開発)すると思うでしょうが、 C++の名前空間は、例えばJavaのpackage等と異なり 同一ファイル内で複数を定義できますので、例えばちょっとしたものでも、 ネストした名前空間などで階層的な整理/分類が可能です。 例えば、 // foo.hpp namespace foo { namespace detail { } namespace impl { } // foo本体 namespace ex { } } 可読性もありますが、C++の名前空間は閉じていないため、 この手の「ちょっとした名前空間わけ」はそれなりに意味がありますし、 こんなのを個別にファイルやディレクトリに分けていたのでは、管理が面倒で仕方ありませんし。
C++のベースであるCには名前空間はありません。しかし、共通な定義をヘッダにしておき、#includeして使用するという概念は最初からあります。 C++が登場した時には名前空間はありませんでしたが、何年かしてから追加されています。 比較的新しいオブジェクト指向言語なら、importするだけ、のような理解しやすい仕様にもできるのですが、C++はCと高い互換性を保っていなければならないですし、クラスや名前空間は必ず使わなければならないものではないので、それぞれが独立しています。
- laughsheep
- ベストアンサー率50% (11/22)
No.1です。すいません。 #ifndef __SAMPLE_H__ の下の行に #define __SAMPLE_H__ を書き忘れてました。無くてもサンプルは動きますが…。