簡體   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