我正在阅读一系列设置'对于来自XML文件的应用程序,我希望这些设置驻留在命名空间中,以便我的所有函数都能够访问。我通过将标题中的命名空间变量声明为' extern int test;'来成功地完成了这项工作。然后在源文件' int test {0}中初始化它们;'。然后在源文件中有一个函数,它读取XML并将值赋给命名空间变量,一切都是hunky dory。
问题是我意识到当他们只需要保持不变时我创建~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之外,我也必须移动临时变量,但即使这样也无关紧要,因为我只需要在执行函数后初始化名称空间变量。我想做什么甚至可能?
答案 0 :(得分:0)
在头文件中声明一个函数原型,然后在你的命名空间中声明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
}
答案 1 :(得分:0)
好的,我不确定这是雨滴正在发生什么,但它激发了我找到这个解决方案。这是我的结构:
//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
我所做的是添加&#39; settings :: readsuccess&#39;变量并使用我的函数初始化它,而不是在我的main开头调用它。现在这个函数实际上在程序启动时立即在主程序启动之前运行并分配所有那些占位符变量,所以当其他变量初始化时,函数已经运行了。
现在我承认,我所做的似乎是一个捷径,但是它有效,现在我已经拥有一个充满100个全局const变量的命名空间,这些变量在运行时初始化,可以在我的程序中的其他地方访问,包括头文件。这是合法的还是更好的,这是一个比仅有100个可变全局变量更好的做法吗?
答案 2 :(得分:-1)
为了设置一个常量全局变量,您需要在定义它时进行设置。所以这样做:
deviceready
另外,设置一百个变量是维护的噩梦。使用设置类。