繁体   English   中英

如何将全局const变量更改为可以通过函数分配的变量

[英]How change global const variables to variables that can be assigned via a function

我有一些包含const gobal变量的代码; 需要扩展代码以支持参数化,即,基于参数必须更改某些变量。 碰巧一些需要更改的变量是全局const

文件1.h

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

file.h被使用ab多个不同.cc继承。


在网上阅读后,我得到了extern关键字的介绍。 因此,遵循一些准则,我做了以下工作。

1)在头文件externs中将ab声明为externs:

extern const double a;
extern const double b;

2)创建了一个file.cc文件,在这里我使用一个函数来为ab赋值:

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;

现在可能是因为abconst所以我收到:

错误:只读变量不可分配


将全局const更改为可以通过函数定义但不能在运行时更改的全局变量的好方法是什么?

您不能写入const变量。 这就是它们首先是const的全部意义。

如果确实需要它们为非const ,则从它们中删除“ const”关键字并重新编译您的应用程序。

注意:使用const_cast无法正常工作,并会导致不确定的行为(不要去那里),因为对象最初是常量。 因此,甚至不要考虑这一点(顺便说一句,“ C样式强制转换”也是const强制转换)。

步骤1:考虑不使用全局变量。 而是将值传递给需要它们的函数/类。

步骤2:再次转到步骤1。

步骤3:好的,好的。 如果您真的想要全局变量,请尝试将它们封装在访问器函数后面。 您可能有类似GetGlobalA()和GetGlobalB()之类的东西,程序中的所有代码都可以访问。 然后有一个InitializeGlobals(),它显然在启动期间或需要设置这些值的任何地方仅使用一次。 变量本身可以简单地是代码文件中的静态变量,除了我描述的功能之外,没有其他任何东西可以直接访问(或者,如果您在类上将其全部静态化,则变量是其私有静态变量)。

如果我对您的理解正确,则希望基于某个参数(编译时或运行时)初始化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());

您不能更改常量。 如果要通过参数设置它们,则常量不是您想要的。 一旦初始化,便无法更改。

我认为一个好的解决方案是编写一个带有私有变量ab的简单类,仅使用getter来获取它们,并使用从参数中对其进行设置的方法。 然后,添加此类的全局实例,并根据需要使用它。 这样,用户将无法直接更改ab ,因为它们已私有化,您可以决定何时设置用户以及何时不能设置。 举个例子:

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;
}

顺便说一句,本例中的ab也不能为const。 将为这些变量调用标准构造函数,并将它们专心设置为0。

将变量包装在类中,然后使用构造函数将其初始化。 您也可以使用单例并且仅设计吸气剂,这样就永远无法更改它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM