Объявить список констант в классе

Я хотел бы создать список констант в своем классе, но не знаю, как это сделать правильно.

Сначала я попытался, но в Enum вот так:

class CMyClass{

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

но кажется, что это невозможно (-> ошибка C2057: ожидаемое постоянное выражение)

Я знаю, что могу просто объявить одну за другой каждую свою константу с помощью #define или с помощью объявления «static const ...», но мне нравится использование: EKeyword.E_PARAM1 для получения моей строки, и я не хочу устанавливать те константы глобальные.

Какие-нибудь рекомендации?


person Thieuma    schedule 08.01.2019    source источник
comment
Что для этого нужно?   -  person Jack Aidley    schedule 08.01.2019
comment
Я создаю список ключевых слов, которые буду искать в файле, а затем обмениваю ключевое слово с его значением. пример: найдите ключевое слово $ temperature - ›замените слово на 28 ° C.   -  person Thieuma    schedule 08.01.2019
comment
Я не работаю с c ++ 11 - знаете, было бы неплохо узнать о таких ограничениях перед фактом.   -  person StoryTeller - Unslander Monica    schedule 08.01.2019


Ответы (2)


Вы не можете создать enum со строковым представлением в C ++. Вам понадобится список строк. Если вы не хотите, чтобы на них ссылались внутри структуры (например, 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";

Вот живой пример.

person Fantastic Mr Fox    schedule 08.01.2019
comment
Лучше. Мне нравится идея определения объема работ. +1 - person StoryTeller - Unslander Monica; 08.01.2019
comment
@StoryTeller Да, это мило. Мы также используем его для перечислений, потому что мы все еще застряли в мире C ++ 03. - person Fantastic Mr Fox; 08.01.2019
comment
Почему я должен использовать constexpr вместо const? - person Thieuma; 08.01.2019
comment
@Thieuma Если вы не хотите использовать это определение в других constexpr функциях или определениях, то вам нужно, чтобы оно было. - person Fantastic Mr Fox; 08.01.2019
comment
Мне нужно будет больше узнать о constexpr, чтобы понять, но, похоже, он доступен только с C ++ 11. Я не работаю над этим. - person Thieuma; 08.01.2019
comment
@Thieuma Я отредактировал вопрос, чтобы учесть ваши изменения. - person Fantastic Mr Fox; 08.01.2019
comment
@FantasticMrFox Делая это, я получаю ошибку C2864: только статические интегральные элементы данных могут быть инициализированы внутри класса - person Thieuma; 08.01.2019
comment
@Thieuma, да, без constexpr вам нужно определить значение строки в файле cpp. Буду обновлять. - person Fantastic Mr Fox; 08.01.2019

После этого комментария от автора вопроса:

Я создаю список ключевых слов, которые буду искать в файле, а затем обмениваю ключевое слово с его значением. пример: найдите ключевое слово «$ temperature» -> замените слово на «28 ° C».

Предлагаемый вами подход к использованию именованных переменных или перечисления будет неуместным для этого, поскольку C ++ не имеет отражения, а имена переменных недоступны из кода. Вам нужна карта - возможно std::map<std::string, std::string>, хотя в зависимости от варианта использования могут потребоваться более высокие параметры производительности - от значений, которые вы хотите найти, до значений, которыми вы хотите их заменить.

Лучший способ сделать это - прочитать файл, содержащий значения замены, потому что тогда вы можете изменить значения замены без изменения кода и получить более общее решение, но в противном случае вы можете использовать унифицированные списки инициализации C ++ 11 для заполнения карту в вашем коде или, возможно, заполните их один за другим, например, в конструкторе, если унифицированная инициализация не подходит для ваших нужд или по какой-то причине C ++ 11 вам недоступен.

Затем вы можете сканировать файлы, находя строки, которые вы хотите заменить, и заменять их указанными заменами. Однако будьте осторожны, что вы будете делать с перекрывающейся заменой? Вы проверяете только слова целиком и т. Д.?

person Jack Aidley    schedule 08.01.2019