在类中声明常量的“列表”

时间:2019-01-08 09:51:42

标签: c++ class constants c++03

我想在我的班级中创建一个常量列表,但是我不知道如何正确地做到这一点。

首先,我尝试这样做,但在这样的枚举中:

class CMyClass{

public:
enum EKeyword
{
  E_PARAM1 = "myString1",
  E_PARAM2 = "myString2",
  ...
};

但似乎不可能(->错误C2057:期望的常量表达式)

我知道我可以使用#define或使用“ static const ...”声明逐个声明一个常量,但是我喜欢使用:EKeyword.E_PARAM1来获取我的字符串,但我不喜欢想要全局设置这些常量。

有没有建议?

2 个答案:

答案 0 :(得分:2)

在c ++中,不能使用字符串表示形式制作enum。您将需要一个字符串列表。如果您不想强迫它们在结构(例如enum class)中被引用,请将它们添加到结构中:

class CMyClass {
public: 
    struct EKeyword {
        static constexpr char const* PARAM_1 = "myString1";
        ...
        private:
           EKeyword(); // Disables the ability to construct an EKeyword struct.

    };
...

然后在类中的使用将类似于:

EKeyword::PARAM_1

在课堂外将是:

CMyClass::EKeyword::PARAM_1

如果限于c++03,则需要在cpp文件中创建字符串值:

// .hpp
class CMyClass {
 ...
 struct EKeyword {
    static char const* PARAM_1;
    ...

// .cpp
char const* CMyClass::EKeyword::PARAM_1 = "myString1";

Here is a live example.

答案 1 :(得分:1)

以下来自提问者的评论:

  

我正在创建要在文件中查找的关键字列表,   然后用其值交换关键字。例如:找到关键字   “ $ temperature”->用“ 28°C”代替

您建议使用命名变量的方法,否则枚举将不适合使用此方法,因为C ++没有反射,并且无法从代码中访问变量名称。您想要的是一张地图-可能是std::map<std::string, std::string>,尽管根据使用情况可能需要更高的性能选项-从要查找的值到要替换为它们的值。

执行此操作的最佳方法是读取包含替换值的文件,因为您可以在不修改代码的情况下修改替换值,并拥有更通用的解决方案,但是您可以使用C ++ 11的统一初始化列表以在您的代码中填充地图,或者在统一初始化不适合您的需求或由于某种原因而无法使用C ++ 11的情况下,例如在构造函数中逐一填充。

然后,您可以浏览文件,找到要替换的字符串,然后用列出的替换字符串替换它们。但是要小心,重叠替换将如何处理?您只检查整个单词等吗?