11

我正在开发一款游戏并且有一个有趣的问题。我有一些游戏范围的常量值,我想在一个文件中实现。现在我有这样的事情:

常量.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" 这很好用,直到我需要使用其中一个常量作为模板参数,因为外部链接的常量不是有效的模板参数。所以我的问题是,实现这些常量的最佳方法是什么?恐怕只是将常量放在头文件中会导致它们在每个翻译单元中定义。而且我不想使用宏。

谢谢

4

8 回答 8

19

摆脱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
于 2009-03-13T04:04:53.150 回答
10

枚举呢?

常量.hpp

  enum {
    BEGINNING_HEALTH = 10,
    BEGINNING_MANA = 5
  }
于 2009-03-13T03:53:35.923 回答
7

在 .hpp 文件中使用“static const int”,并在 .cpp 文件中不添加任何内容(当然,除了您拥有的任何其他代码)。

于 2009-03-13T04:33:53.893 回答
4

使用命名空间:

namespace GameBeginning {
    const int HEALTH = 10;
    const int MANA   = 5; 
};

然后你可以使用作为 player.health = GameBeginning::HEALTH;

于 2009-03-13T12:18:37.940 回答
0

大多数编译器根本不为 const POD 值分配空间。他们优化它们并将它们视为已被删除#define,不是吗?

于 2009-03-13T04:06:39.480 回答
0

一个简单的事情曾经发生过:

#define BEGINNING_HEALTH 10

伙计,那是那些日子。
哦,等等,那仍然是日子!

于 2009-03-13T06:51:05.967 回答
-2

也许类似于静态类的东西?

class CONSTANTS {
public:
static inline int getMana() { return 10;};
};
于 2009-03-13T03:53:39.917 回答
-5

作为对标题问题的快速回答,单例模式可能是一种最好的 C++ 方式来定义跨文件常量并确保仅对象的一个​​实例。

至于模板参数问题,你需要传递一个类型而不是一个值。你的类型是“int”。

于 2009-03-13T04:10:34.057 回答