c++ - 如何创建全局参数对象

标签 c++ configuration global-variables

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

我找到了 this implementation对于 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);
}

然后将parameters设为全局变量。但我也读到应该使用单例而不是全局变量。如何用文件名实例化单例?

这一定是一项如此常见的任务,我认为一定有一种普遍接受的好方法来完成它?如果有人能指点我,我将不胜感激。

谢谢, C

最佳答案

如果您要自己动手,我建议您对配置类使用单例设计模式。 让类本身存储它自己类型的静态指针,并且构造函数是私有(private)的,因此人们将被迫使用静态 getter 来获取类的一个实例。

所以一个模型(可能无法编译,缺少有趣的配置功能,但应该说明这一点)

class Config
{
public:
   static Config * getConfig();
   static void setConfigFileName(string filename);
private:
   Config();
   static string m_filename;
   static Config * m_configInstance;
};

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

因此您的 main() 将使用 setConfigFileName(),然后任何类都只需调用 Config::getConfig(),然后调用其上的操作。比标准全局变量干净得多。

Blast - 在我写这篇文章的时候,其他人也建议使用单例设计模式。好吧 - 希望额外的解释有所帮助。

关于c++ - 如何创建全局参数对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1099379/

相关文章:

c++ - 如何在 Eigen C++ 中加速 LU 分解?

java - 应用程序服务器 JDBC 资源的 DataSource 或 ConnectionPoolDataSource

python - 迭代地将字典转换为一组全局变量

c++ - 如何使用我自己的库 C++ ubuntu

java - 在 Java 中使用 native 代码的优点和缺点?

c++ - SQLBrowseConnect 似乎没有枚举本地域上的服务器

python neurolab 前馈神经网络

c# - 如何将 Untiy 配置从 1.2.* 转换为 2.0.*

javascript - 将textarea输入的值保存到js变量中并使其在任何地方都可见

php - 如何跨两个文件访问变量