質問

私はゲームに取り組んでおり、興味深い質問があります。 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"です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top