2012-03-28 6 views
0

私はしばしば、プログラムのためのグローバルなパラメータセットを用意したいと思っています。私は、「静的」、これは、AOとBOを作るために含まれている場合、しかし、簡潔かつ簡単にアクセスできる、一緒に他の人が使っている別のファイルのC++ネームスペース

namespace Params { 
    static int WindowHeight = 600; 
    //...etc. 
}; 

のようなものを、これらのパラメータを維持したいと思いますこれらの変数は、それぞれの.oファイルにローカルではなく、維持可能それらは共有され、「静的」は複数の定義につながります。 別のオプションは、

class Params { 
    public: 
    static int WindowHeight; 
    //...etc. 
} 

のような静的なクラスを作成することです。しかし、あなたは別に他の場所でパラメータを初期化する必要があります。

int型のparams :: WindowHeight = 600;

これは私が実際に避けたいものです。 私も

namespace Params { 
    static int WindowHeight 
#ifdef __MUST_INIT_PARAMS 
    = 600 
#endif 
    ; 
}; 

限り、各エントリは一つの場所に保つことができるよう(ちなみに、私のために動作しませんでした)、次のようなものを受け入れるだろう。

アイデア?あらゆる種類の助けが素晴らしいだろう! ありがとう!

+0

静的クラスメンバーをインラインで初期化することができます。 (例えば、static int WindowHeight = 600;) – Bukes

+0

私のgccが文句を言うので、一部のコンパイラでのみ正しいと思います。 'エラー:ISO C++は非const静的メンバー 'var'のクラス内初期化を禁じています。それはconstでなければならないと思うけど、それは私にとってはうまくいかないでしょう。 – StokedOver9k

+1

@ StokedOver9k - 彼は "整数型である静的constクラスメンバー"と言っていました。 –

答えて

0

staticの代わりにexternを使用する必要があります。
cppファイルで1回定義してください。

//Filename.h

namespace Params 
{ 
    extern int WindowHeight; 
}; 

staticのあなたの最初の使用は、その変数を宣言したCPPファイルの一つ
//Filename.cpp

namespace Params 
{ 
    int WindowHeight = 100; 
}; 
+0

私はまだリンク中に複数の定義を取得します。 – StokedOver9k

+0

@ StokedOver9k:あなたが何をしたかを表示しない限り、なぜそれを伝えるのは難しいです。 –

0

それを定義しますヘッダーを含む各翻訳単位に固有です。クラスの中では、staticはまったく新しいことを意味し、クラススコープの変数を宣言します。名前空間の内部グローバルを定義するには

、あなたはexternを使用する必要があります。

//header.h 
namespace Params { 
    extern int WindowHeight; 
}; 

//definition.cpp 
namespace Params 
{ 
    int WindowHeight = 600; 
} 
+0

迅速な対応をありがとう。 しかし、ここで考えているのは、params(定義と宣言)をすべて1か所(1つのファイル)に保つことです。 これは可能か、標準の.h + .cppコンボに行く唯一の方法ですか?私は余分な.o(またはメインにデフォルト値を書かなくてはならない)を作ることにあまり気をつけていません。 – StokedOver9k

+1

@ StokedOver9k '#define WindowHeight 600'は、' extern'宣言したくない場合にそれを行います。余分な '.o'ファイルを作成する必要はありませんが、' cpp'ファイルにWindowHeightを定義するだけです。どのファイルでも問題ありません。 –

0

あなたがこれを行う必要があります。

//Params.cpp 

#include "Params.h" //not needed! 

namespace Params { 
    int WindowHeight = 600; //it is definition 
}; 
-1
.cppファイルで

//Params.h 

namespace Params { 
    extern int WindowHeight; //it is declaration 
}; 

、その後に

上記のように、静的ではなくexternを使用する必要があります。あなたは、同じファイル内の宣言と定義をしたい場合は、にexternを使用する場合、定義を持つあなたの最後の試みは動作します:

namespace Params { 
    extern int WindowHeight 
#ifdef __MUST_INIT_PARAMS 
    = 600 
#endif 
    ; 
}; 
1

あなたのすべてのパラメータは、コンパイル時に知られている整数である場合は、enumを使用することができます。

namespace Params { 
    enum e { 
    WindowHeight = 600, 
    // etc. 
    }; 
} 

使用方法:(上記のあなたの例のように)整数型です

InitWindow(Params::WindowHeight); 
+0

はい...しかし、一部のパラメータは整数ではなく、変更される可能性があります。 – StokedOver9k

関連する問題