[英]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.