Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.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++_Configuration_Global Variables - Fatal编程技术网

C++ 如何创建全局参数对象

C++ 如何创建全局参数对象,c++,configuration,global-variables,C++,Configuration,Global Variables,这里有一个常见的简单任务:从配置文件读取配置设置,将设置保存在对象中(例如,作为哈希),从需要访问配置参数的各种对象访问此对象 我找到了ConfigFile类实现的方法,它可以正常工作。我的问题是:让这个类的一个实例从我的其他类中可用并且是线程安全的、避免静态初始化顺序失败的最佳方法是什么 我目前的方法是在main()中使用 //从配置文件中读取与人脸检测相关的参数值。 字符串configFileName=“detection\u parameters.txt”; 试一试{ 参数=ConfigF

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

我找到了ConfigFile类实现的方法,它可以正常工作。我的问题是:让这个类的一个实例从我的其他类中可用并且是线程安全的、避免静态初始化顺序失败的最佳方法是什么

我目前的方法是在main()中使用

//从配置文件中读取与人脸检测相关的参数值。
字符串configFileName=“detection\u parameters.txt”;
试一试{
参数=ConfigFile(configFileName);
}
捕获(ConfigFile::未找到文件){

cerr您看过库了吗?

我为我的配置类所做的是创建一个带有哈希表缓存的单例静态类。我的配置文件设计为可读写,用于更改应用程序设置


每当调用某个设置时,我都会在哈希表上执行查找,如果它不在那里,那么我会从文件中读取设置,锁定哈希表,然后将其放入哈希表。哈希表的查找速度非常快。

我同意Chris的观点,使用单例模式。单例模式的优点是它只初始化/gathers您第一次尝试访问所需的数据,从那时起,所有感兴趣的人都可以使用这些数据。如果您要允许更改配置,则需要锁定写入程序。

如果您要自行启动,我建议您在配置类中使用Singleton设计模式。 让类本身存储自己类型的静态指针,并且构造函数是私有的,这样就可以强制使用静态getter来获取类的一个实例

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

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

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


Blast-在我写这篇文章的时候,其他人也提出了单例设计模式。啊,好吧-希望附加的解释能有所帮助。

提到“静态初始化顺序失败”,我假设您需要配置项来初始化某些静态对象。singleton ConfigFile类可以工作,但您必须更改获取文件名的方式,因为在main()之前需要这些信息已启动。您需要另一个单例来提供文件名,或者将文件名构建到配置类本身。

我使用了类似于单例设计模式的技术来配置这样的全局资源

class Config
{
public:
   Config(const string & filename) {
      if (m_configInstance) {
         throw AlreadyInitException;
      }
      // do main init
      m_configInstance = this;
   }

   ~Config() {
      m_configInstance = 0;
   }

   static Config * getConfig() {
      if (!m_configInstance) {
         throw NoConfigException;
      }
      return m_configInstance;
   }

private:
   static Config * m_configInstance;
};

Config * Config * m_configInstance = 0;
构造函数测试是否未设置
m_configInstance
,如果设置了,则会引发异常。然后,通过将
m_configInstance
设置为
this
,完成构造并注册自身

getConfig
方法返回实例,如果未设置,则抛出和异常

析构函数将
m_configInstance
再次设置为0

要使用该类,请在
main()
的开头构造它一次。然后在
getConfig()
方法需要时访问它


现在,
Config
对象的生命周期得到了干净的控制,这与单例不同。这对单元测试有一个额外的好处,每个测试或测试套件都可以创建自己的
Config
对象,并且它们在测试之间都得到了很好的清理。

boost PO库处理命令行程序选项,我的问题是关于要从文件中读取的配置选项。
class Config
{
public:
   static Config * getConfig();
   static void setConfigFileName(string filename);
private:
   Config();
   static string m_filename;
   static Config * m_configInstance;
};
class Config
{
public:
   Config(const string & filename) {
      if (m_configInstance) {
         throw AlreadyInitException;
      }
      // do main init
      m_configInstance = this;
   }

   ~Config() {
      m_configInstance = 0;
   }

   static Config * getConfig() {
      if (!m_configInstance) {
         throw NoConfigException;
      }
      return m_configInstance;
   }

private:
   static Config * m_configInstance;
};

Config * Config * m_configInstance = 0;