ファイル間の定数を定義するC ++の最適な方法
質問
私はゲームに取り組んでおり、興味深い質問があります。 1つのファイルに実装したいゲーム全体の定数値がいくつかあります。今私はこのようなものを持っています:
constants.cpp
extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
constants.hpp
extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;
そして、#include" constants.hpp"だけをファイルします。 外部リンクされた定数は有効なテンプレートパラメーターではないため、テンプレートパラメーターとして定数の1つを使用するまで、これはうまく機能していました。 だから私の質問は、これらの定数を実装する最良の方法は何ですか?ヘッダーファイルに定数を入れるだけで、各変換単位で定数が定義されるのではないかと思います。そして、マクロを使いたくありません。
ありがとう
解決
extern
を取り除くと設定は完了です。
すべてが「本当に一定」であるため、このコードはヘッダーで完全に機能します。したがって、内部リンケージがあります:
const int BEGINNING_HEALTH = 10;
const int BEGINNING_MANA = 5;
const char BEGINNING_NAME[] = "Fred";
const char *const BEGINNING_NAME2 = "Barney";
各行には外部リンケージがあるため(明示的に、または完全に一定ではないため)、このコードをヘッダーファイルに安全に配置することはできません:
extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
const char *BEGINNING_NAME = "Wilma"; // the characters are const, but the pointer isn't
他のヒント
列挙型はどうですか?
constants.hpp
enum {
BEGINNING_HEALTH = 10,
BEGINNING_MANA = 5
}
" static const int"を使用します.hppファイルに追加し、.cppファイルには何も配置しません(もちろん、他にあるコードは除きます)。
名前空間を利用する:
namespace GameBeginning {
const int HEALTH = 10;
const int MANA = 5;
};
then uはplayer.health = GameBeginning :: HEALTH;として使用できます
ほとんどのコンパイラは、単にconst POD値にスペースを割り当てません。彼らはそれらを最適化し、 #define
dされたかのように扱いますか?
これまでにシンプルに起こったこと:
#define BEGINNING_HEALTH 10
男、それらは日々だった。
ああ待って、それらのまだ日です!
おそらく静的クラスの線に沿って何か?
class CONSTANTS {
public:
static inline int getMana() { return 10;};
};
タイトルの質問に対する簡単な回答として、シングルトンパターンは、ファイル間定数を定義し、オブジェクトの1つのインスタンスのみを保証するための、C ++の最良の方法です。
テンプレートパラメータの問題に関しては、値ではなく型を渡す必要があります。タイプは" int"です。