2012-05-09 29 views
1

異なるヘッダーファイルからアクセスできるC++で名前空間を使用する方法。私は下のこの考えてみましょう:C++での名前空間

// namespaces 
#include <iostream> 
using namespace std; 

namespace first 
{ 
    int var = 5; 
} 

namespace second 
{ 
    double var = 3.1416; 
} 

int main() { 
    cout << first::var << endl; 
    cout << second::var << endl; 
    return 0; 
} 

を、私はtは、別のクラスの最初の名前空間からのvar変数を使用したい...それは別の.hと.cppのファイルで定義され、実装されていますか?

//server.h 
    #ifndef SERVER_H 
    #define SERVER_H 
    class server{ 
     server(); 
    //blah 
    }; 
    #endif SERVER_H 

//server.cpp 
server::server() 
{ 
    first::var = 3; 
} 

これは次のようにできますか?試してみると、私の名前空間が定義されていないというエラーが表示されます。そして、私はヘッダーに名前空間を持つほかに...最初の.hにあるか、それは最初に呼ばれる名前空間が存在しないと言うの.cpp

+1

おそらくそれらの名前空間をヘッダーファイルに入れ、必要な場所にその名前空間を含めてください。 – chris

+1

これをしないでください!なぜあなたは1日後に質問を大幅に変更していますか?新しい質問をする。 –

答えて

10

を名前空間を使用して置けば、あなたは変数のexternを行う必要があります。

//header.h 
namespace first 
{ 
    extern int var; 
} 


//implementation.cpp 
#include "header.h" 
namespace first 
{ 
    int var = 5; 
} 

変数がexternでない場合は、ヘッダーが含まれている場所にシンボルが生成され、リンカーエラーが発生します。

あなたは余分なヘッダをしたくない場合は、あなたがそれを使用したい場合は、あなただけの同じ名前空間にexternとして変数を宣言することができます。

//server.cpp 
namespace first 
{ 
    extern int var; 
} 
server::server() 
{ 
    first::var = 3; 
} 

いくつかの答えは、あなたがすべきことを主張するかもしれません変数staticを作成します。これは間違っていますが、変数はグローバルとして機能しないため、コンパイルされます。翻訳単位ごとにそのコピーが作成されます。

+1

私はそのことを嫌っているので、すべての翻訳単位に対して静的なコピーを作成することを学んだことはありません。情報をありがとう!また、@CrazyEddie私たちは皆、C++のコーナー部分をここであちこち見逃しています。 –

+0

@CrazyEddieあなたのコメントの直前に反映するように編集しました。 –

+0

implementation.cppでも:int first :: var = 5; ' –