2013-12-10 3 views
2

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

В настоящее время у нас есть класс, как

class Settings 
{ 
    public: 
     static constexpr unsigned int CONSTANT_ONE{1}; 
     ... 
} 

Проблема в том, некоторые из этих констант мы предпочли бы иметь возможность установить при запуске программы (как названия государств, пользователь должен быть в состоянии сделать это) вместо того, чтобы быть предопределенным в коде.

Есть ли nice Способ для этого, и все еще переменные постоянны?

Благодарен за ввод, приветствия!

+0

Вы хотите динамически изменять значения, т. Е. Может быть, они различны при каждом запуске программы? –

+0

Да, это мысль, но они не могут быть изменены во время работы программы (причина, по которой мы хотим, чтобы они были const). – pingul

+0

Хм, это немного сложно, так как вы только получаете доступ к флагам командной строки, когда находитесь в 'main'. Вы можете использовать среду ('getenv()') до 'main', но это не очень элегантно. –

ответ

3

Вы можете разместить константы в private секции класса Settings, сделать статические методы получения для них и написать статическую функцию Initialize:

class Settings 
{ 
public: 

    static bool Initialize(); 

    static unsigned int CONSTANT_ONE(); 

    ... 

private: 

    static unsigned int constantOne; 

    ... 
}; 

... 

bool Settings::Initialize() 
{ 
    static bool isInitialized = false; 

    if (isInitialized) 
    { 
     // error 
     return false; 
    } 
    else 
    { 
     isInitialized = true; 
    } 
    constantOne = 1; 
    ... 

    return true; 
} 

unsigned int Settings::CONSTANT_ONE() 
{ 
    return constantOne; 
} 

... 

Вы также можете определить макрос для создания геттеров автоматически:

#define CONSTANT_NAME(Name) my_##Name 

#define DECLARE_CONSTANT(Type, Name) \ 
    public: \ 
     static Type Name(); \ 
    private: \ 
     static Type CONSTANT_NAME(Name); 

#define DEFINE_CONSTANT(Type, Name) \ 
    Type Settings::Name() \ 
    { \ 
     return CONSTANT_NAME(Name); \ 
    } \ 
    Type Settings::CONSTANT_NAME(Name); 

Пример использования:

class Settings 
{ 
    ... 
    DECLARE_CONSTANT(unsigned int, CONSTANT_ONE) 
    ... 
}; 

... 

DEFINE_CONSTANT(unsigned int, CONSTANT_ONE) 
+0

Я размышлял об этом немного, но все еще существует проблема: значения все еще не могут быть постоянными? (Например, значение constantOne). Основной вопрос заключался в том, чтобы все еще иметь постоянные переменные, но иметь возможность инициировать их при выполнении программы. – pingul

+0

@pingul Вы не можете изменять эти переменные вне класса 'Настройки'. Если что-то похоже на константу, это константа. – Constructor

+0

Не в глазах компилятора я боюсь; функции, требующие параметров 'const', нуждаются в том, что const. Однако я вижу вашу точку зрения. – pingul

0

Я сделал что-то подобное, но не совсем уверен, что это послужит вашей потребности.

Я объявляю следующую строку в классе приватной секции в заголовке:

static const char mod_name[32]; 

Я тогда его экземпляр в источнике, как следующее:

const char CLASS_NAME::mod_name[32] = "SOME STRING"; 

Может быть, начать с этого и посмотреть, как вы можете пройти значение в?

Кроме того, в качестве частного члена const вы можете создавать экземпляр при построении экземпляра, который дает вам способ прохождения в таких постоянных значениях.

Смежные вопросы