Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用函数中的值初始化命名空间中的全局常量变量?_C++_Namespaces_Global Variables_Constants_Mutable - Fatal编程技术网

C++ 如何使用函数中的值初始化命名空间中的全局常量变量?

C++ 如何使用函数中的值初始化命名空间中的全局常量变量?,c++,namespaces,global-variables,constants,mutable,C++,Namespaces,Global Variables,Constants,Mutable,我正在从一个XML文件中读取应用程序的一组“设置”,我希望这些设置驻留在一个名称空间中,以便我的所有函数都能够访问。我已经成功地完成了这项工作,将头中的名称空间变量声明为'extern int test;'然后在源文件“int test{0};”中初始化它们。然后在源文件中有一个函数,它读取XML并将值赋给名称空间变量,所有内容都很好 问题是我意识到我正在创建大约100个可读写的全局变量,而它们只需要是常量。所以我现在正试图改变我的代码,因为它们是常量,我不知道这怎么可能。以下是我尝试过的: /

我正在从一个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之外,我还必须移动临时变量,但即使如此,也没关系,因为我只需要在函数执行后初始化名称空间变量。我想做的是可能的吗?

为了设置常量全局变量,需要在定义时设置它。这样做:

const int ktest = getValueofKtest();

此外,设置100个变量是维护的噩梦。使用设置类。

在头文件中声明函数原型,然后在名称空间中声明,并根据其返回值初始化外部常量。然后在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 
}
//header.hpp
#布拉格语一次
int RetValue();//原型
名称空间A{
外部常量int值(RetValue());
}
//source.cpp
int RetValue(){return 7;}//定义RetValue
int main()
{

cout好的,我不确定这是否是Raindrople的目的,但它启发我找到了这个解决方案。以下是我的结构:

//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
//xmlreader.hpp
#布拉格语一次
//割台护板
int ReadXML();
名称空间设置{
extern const int kreadsucces;//必须是第一个,是read函数的结果
外部常量内部测试;
}
//xmlreader.cpp
#包括“xmlreader.hpp”
静态int测试{0};//读取函数出现异常时的默认值
int ReadXML(){
//在此处读取xml代码,如果成功,则分配新的“测试”值
试验=2;
返回1;
}
名称空间设置{
const int kreadsucces{ReadXML()};//现在在main之前执行ReadXML!
const int ktest{test};
}
//main.cpp
#包括“xmlreader.hpp”
//如果(ReadXML()>0){}//是旧代码,现在在初始化时调用
如果(设置::kreadsuccess>0){

是的,我刚刚读了一篇文章,还建议使用一个返回函数。正如你所说的,返回函数的问题是,我必须为每个变量编写一个函数,这意味着我必须打开、读取和关闭xml 100次。效率不是很高。也许我会创建一个单例类并通过引用将其传递给我的线程。仍然比使用名称空间要麻烦一些,但是我要避免可变的全局变量?每个变量的函数并不意味着您必须读取每个变量的xml。我看不出在实践中这与Anon的建议有什么不同。我仍然必须为每个单独的变量创建一个RetValue,除了这里我将在头文件而不是源文件中初始化。除了更干净(有争议)的代码之外,还有其他好处吗?因为我不必在源文件中初始化名称空间变量?(相反,我必须在头文件中放入函数原型).我会说问题不在于你是否有可变的或常量的全局变量。我会说问题在于全局变量。还有100个。这不是好的编程实践。我不这么认为,但是如果你有100个全局变量,如果它们是常量不是更好?这个变化不需要我去改变eve这是一个单一的源文件,但至少使它们保持不变,我认为这将是一个改进。