簡體   English   中英

如何使用函數中的值初始化名稱空間中的全局const變量?

[英]How to initialize global const variables in a namespace with values from a function?

我正在從XML文件中讀取一堆應用程序的“設置”,我希望這些設置駐留在命名空間中,以便我所有的功能都可以訪問。 通過將標頭中的名稱空間變量聲明為“ extern int test”,我成功完成了這項工作。 然后在源文件“ int test {0};”中對其進行初始化。 然后,在源文件中,有一個函數讀取XML,並將該值分配給名稱空間變量,並且一切正常。

問題是我意識到當它們只需要保持恆定時,我正在創建〜100個可讀寫全局變量。 因此,我現在嘗試更改代碼,因為它們是恆定不變的,我看不出它是怎么可能的。 這是我嘗試過的:

//settings.hpp
#pragma once
//header guard

namespace settings {
    extern const int ktest;
}

//settings.cpp
void ReadXML() {
    int testvalue{1}; //1 is default values

    //here would be some code that gets value form XML and assigns it to testvalue

    namespace settings {
        const int ktest{testvalue};
    }
}

現在的問題是我無法將名稱空間值放入函數中。 因此,如果將它們移至ReadXML函數之外,我也必須移入臨時變量,但即使這樣也沒關系,因為我只需要在函數執行后初始化命名空間變量。 我嘗試做的事情甚至可能嗎?

在頭文件中聲明一個函數原型,然后在您的命名空間中使extern常量根據其返回值進行初始化。 然后在main中定義函數:

//header.hpp
#pragma once

int RetValue(); // prototype

namespace A{
    extern const int value(RetValue());
}


//source.cpp

int RetValue(){return 7;} // defining retValue

int main()
{
    cout << A::value << endl; // output: 7 
}

好的,我不確定這是否就是雨滴,但它啟發了我找到這種解決方案。 這是我的結構:

//xmlreader.hpp
#pragma once
//header guard

int ReadXML();

namespace settings {
    extern const int kreadsucces;   //Has to be first, is result of read function
    extern const int ktest;
}

//xmlreader.cpp
#include "xmlreader.hpp"
static int test {0};            //Default in case of exception in read function

int ReadXML() {
    //xml read code here, assign new 'test' value if successful
    test = 2;
    return 1;
}

namespace settings {
    const int kreadsucces{ReadXML()};   //ReadXML is executed before main now!
    const int ktest{test};
}

//main.cpp
#include "xmlreader.hpp"
// if (ReadXML() > 0) {}                //Was old code, now called at initialization
if (settings::kreadsuccess > 0) {
    std::cout << "XML read succesful" << std::endl;
} else {
    std::cout << "XML read failed, using defaults" << std::endl;
}
std::cout << settings::ktest << std::endl; //Prints 2

我要做的是添加'settings :: readsuccess'變量並使用我的函數對其進行初始化,而不是在main的開頭進行調用。 現在,此函數實際上在程序啟動之前立即運行,甚至在main啟動之前也已運行,並分配了所有那些占位符變量,因此,在初始化其他變量時,這些函數已經運行。

現在我承認,我所做的事情似乎有點捷徑,但是它可以正常工作,現在我有了一個在運行時初始化的,充滿了100個全局const變量的命名空間,可以通過包含頭文件在程序中的其他任何地方訪問。 與僅擁有100個可變全局變量相比,這是合法的做法,還是更好的做法,是更好的做法嗎?

為了設置一個常量全局變量,您需要在定義它時對其進行設置。 這樣做:

const int ktest = getValueofKtest();

同樣,設置一百個變量也是維護的噩夢。 使用設置類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM