如何创建全局参数对象

rec*_*ion 7 c++ configuration global-variables

这是一个常见的简单任务:从配置文件中读取配置设置,将设置(例如,作为哈希)保存在对象中,从需要访问配置参数的各种对象访问此对象.

我发现ConfigFile类实现的这个实现,它的工作原理.我的问题是:什么是从我的其他类中提供此类的实例并且是线程安全的最佳方法,避免静态初始化顺序惨败等.

我目前的方法是使用main()构建它

    // Read face detection related parameter values from the configuration file.
string configFileName = "detection_parameters.txt";
try {
    parameters = ConfigFile( configFileName );
}
catch(ConfigFile::file_not_found) {
    cerr << "configuration file not found: " << configFileName << endl;
    exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

然后使参数成为全局变量.但我也读到应该使用单例而不是全局变量.如何使用文件名实例化单例?

这一定是一项普遍的任务,我认为必须有一个普遍接受的好方法吗?如果有人能指出我,我将不胜感激.

谢谢,C

Mar*_*arc 6

如果您打算自己动手,我建议您使用Singleton设计模式进行配置.让类本身存储自己类型的静态指针,并且构造函数是私有的,因此将强制使用静态getter来获取类的一个实例.

所以一个模拟(可能无法编译,缺少有趣的Config功能,但应说明一点)

class Config
{
public:
   static Config * getConfig();
   static void setConfigFileName(string filename);
private:
   Config();
   static string m_filename;
   static Config * m_configInstance;
};
Run Code Online (Sandbox Code Playgroud)

如果我不清楚,getConfig()将查看m_configInstance.如果它不是有效的,那么它将创建一个(可以访问私有构造函数)并将其存储在m_configInstance中,这样每个后续调用都将访问同一个调用.

所以你的main()将使用setConfigFileName(),然后任何类只需要调用Config :: getConfig()然后调用它上面的操作.比标准的全局变量更清洁.

爆炸 - 在我写这篇文章的时候,其他人也提出了单身设计模式.好啊 - 希望额外的解释有所帮助.