Объявите «список» констант в классе - PullRequest
0 голосов
/ 08 января 2019

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

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

class CMyClass{

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

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

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

Любые рекомендации?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

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

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

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

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

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

0 голосов
/ 08 января 2019

Вы не можете создать 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";

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

...