这是一个常见的简单任务:从配置文件中读取配置设置,将设置(例如作为散列)保存在对象中,从需要访问配置参数的各种对象访问该对象。
我找到了 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/