C++ лучший способ определить межфайловые константы
Вопрос
Я работаю над игрой и у меня есть интересный вопрос.У меня есть несколько общеигровых констант, которые я хочу реализовать в одном файле.Сейчас у меня есть что-то вроде этого:
константы.cpp
extern const int BEGINNING_HEALTH = 10;
extern const int BEGINNING_MANA = 5;
константы.hpp
extern const int BEGINNING_HEALTH;
extern const int BEGINNING_MANA;
А затем файлы просто #include "constants.hpp" Это работало отлично, пока мне не нужно было использовать одну из констант в качестве параметра шаблона, потому что константы, связанные с внешне, не являются действительными параметрами шаблона.Итак, мой вопрос: как лучше всего реализовать эти константы?Я боюсь, что простое размещение констант в заголовочном файле приведет к тому, что они будут определены в каждой единице перевода.И я не хочу использовать макросы.
Спасибо
Решение
Избавьтесь от 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
Другие советы
Как насчет перечислений?
константы.hpp
enum {
BEGINNING_HEALTH = 10,
BEGINNING_MANA = 5
}
Используйте «static const int» в своем файле .hpp и ничего не помещайте в файл .cpp (за исключением, конечно, любого другого кода, который у вас там есть).
используйте пространства имен:
namespace GameBeginning {
const int HEALTH = 10;
const int MANA = 5;
};
тогда вы можете использовать как player.health = GameBeginning::HEALTH;
Большинство компиляторов просто не выделяют место для константных значений POD.Они оптимизируют их и относятся к ним так, как если бы они были #define
д, не так ли?
Что случилось с простым:
#define BEGINNING_HEALTH 10
Блин, это были дни.
Ой, подождите, эти все еще есть в дни!
возможно, что-то вроде статического класса?
class CONSTANTS {
public:
static inline int getMana() { return 10;};
};
В качестве быстрого ответа на главный вопрос: шаблон Singleton — возможно, лучший способ C++ определить межфайловые константы и гарантировать только один экземпляр объекта.
Что касается проблемы с параметром шаблона, вам нужно передать тип, а не значение.Ваш тип — «int».