2016-08-13 9 views
0

У меня есть код, который содержит const глобальных переменных; Код должен быть расширен для поддержки параметризации, т. Е. На основе параметра, который некоторые переменные должны изменить. Бывает, что некоторые из переменных, которые необходимо изменить, являются глобальными const.Как изменить глобальные константные переменные на переменные, которые могут быть назначены с помощью функции

file1.h

const double a = 2; 
const double b = 3; 

file.h наследуется несколько различных .cc, которые используют a и b.


После прочтения онлайн я познакомился с ключевыми словами extern. Поэтому, следуя некоторым рекомендациям, я сделал следующее.

1) Заявленный a и b в externs в файле заголовка: file.h:

extern const double a; 
extern const double b; 

2) Создано file.cc файл, в котором я использую функцию для присвоения значений a и b:

void setConsts(double parameter){ 
    /* request the linkage */ 
    extern const double a; 
    extern const double b; 

    if (parameter == 9){ 
     a = 2 * 9; 
     b = 3 * 9; 
    } 
    else if (parameter == 10){ 
     a = 2 * 10; 
     b = 3 * 10; 
    } 
    else{ 
     std::cout<<"parameter not supported"<<std::endl; 

Теперь, вероятно, потому, что a и b являются const s я получаю:

error: read-only variable is not assignable


Что такое хороший и элегантный способ изменения глобальных const S в глобальные переменные, которые можно определить с помощью функции, но все-таки убедиться, что они не будут изменены во время работы -время?

ответ

0

Шаг 1: Рассмотрите возможность использования глобальных переменных. Вместо этого передайте значения в нужные им функции/классы.

Шаг 2: Перейдите к шагу 1 еще раз.

Шаг 3: Хорошо, отлично. Если вы действительно хотите глобальные ... Попробуйте инкапсулировать их за функциями доступа. У вас может быть что-то вроде GetGlobalA() и GetGlobalB(), доступ ко всему коду в вашей программе. Затем используйте InitializeGlobals(), который, очевидно, используется только один раз во время запуска или где бы то ни было, что эти значения должны быть установлены. Сами переменные могут просто быть статическими внутри файла кода, и ничто другое не имеет прямого доступа к другим, кроме описанных мной функций (или если вы сделаете все это статикой в ​​классе, то переменные являются их частной статистикой).

3

Вы не можете написать переменные const. В этом весь смысл: const.

Если вам действительно нужно, чтобы они были не const, удалите из них ключевое слово "const" и перекомпилируйте приложение.

Примечание: использование const_cast будет не работать и приведет к неопределенному поведению (не туда), поскольку объекты изначально являются константами. Так что даже не думайте, что (и btw «C style cast» также является const cast).

-1

Вы не можете изменить константы. Если вы хотите установить их из параметра, константы не что вы ищете. После их инициализации они не могут быть изменены.

Я думаю, что хорошее решение будет писать простой класс с приватными переменными a и b, с помощью только геттеров, чтобы получить их, и метод их установки из параметра. Затем добавьте глобальный экземпляр этого класса и используйте его так, как хотите. Таким образом, пользователь не сможет напрямую изменять a и b, так как они приватизированы, и вы можете решить, когда пользователь может установить их и когда он не сможет. В качестве примера:

class optionsClass { 
public: 
    optionsClass():parametersSet(false) {}; 
    double getA(void) const {return a;} 
    double getB(void) const {return b;} 
    setParameter(double parameter) { 
     if(!parametersSet) {compute a and b here; parametersSet = true;} 
    } 
private: 
    bool parametersSet; double a, b; 
} 

a и b в этом примере также не может быть константной, кстати. Для этих переменных вызывается стандартный конструктор, и они автоматически назначаются на 0.

+0

«* Вы не можете изменить константы. Их значение вычисляется в процессе компиляции, а не во время выполнения *» это 'constexpr' переменной, а не' const'. Рассмотрим это: 'const int a = getInt(); int getInt() {int a; scanf ("% d ', a); return a}' – PcAF

+0

@PcAF мой плохой, извините. В любом случае ни 'const', ни' constexpr' не подходят для ситуации афер. – sx107

-1

Оберните переменные в класс и используйте конструктор для их инициализации. Вы также можете использовать singleton и design only getter, чтобы вы никогда не могли их изменить.

0

Если вы правильно поняли, вы хотите инициализировать переменную const на основе некоторого параметра (либо времени компиляции, либо времени выполнения). Обратите внимание, что переменные constмогут быть инициализированы выражением выполнения.

double getParameter() 
{ 
    //obtain parameter and return it 
    return 9; 
} 

double getValueOfA(double param) 
{ 
    if (param==9) 
     return 2*9; 
    if (param==10) 
     return 2*10; 
    else{ 
     throw(std::runtime_error("parameter value not supported")); 
    } 
} 

double getValueOfB(double param) 
{ 
    if (param==9) 
     return 3*9; 
    if (param==10) 
     return 3*10; 
    else{ 
     throw(std::runtime_error("parameter value not supported")); 
    } 

} 

const double a=getValueOfA(getParameter()); 

const double b=getValueOfB(getParameter()); 

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

  • Нет связанных вопросов^_^