在大型C ++项目中处理配置的最佳方法

时间:2013-04-16 15:55:39

标签: c++

为了启动我的C ++程序,我需要阅读一些配置,例如IP地址,端口号,文件路径......这些设置可能会频繁更改(每周或每天!),因此将它们硬编码到源文件中并不是一个好主意。

经过一些研究,我很困惑是否有最佳实践从文件加载配置设置,并使这些配置可用于同一项目中的其他类/模块/ * .cpp。

static bad ;单身是反模式?)那么,我们还有其他选择吗?或者,也许“配置文件”的想法是错误的?

编辑:我没有加载配置文件的问题。将所有这些设置加载到std :: map<之后我很担心string,string>在内存中,如何让其他类,函数访问这些设置。

编辑2:感谢大家的投入。我知道我在这里列出的这些模式是 FINE ,它们被许多程序使用。我很好奇是否有(某种) BEST 模式来处理程序的配置。

3 个答案:

答案 0 :(得分:3)

可以说,配置文件是Singleton的合法用途。 Singleton模式通常不受欢迎,因为Singletons在多线程环境中引起竞争条件的问题,并且由于它们是全局可访问的,因此遇到了与globals相同的问题。但是,如果您在读取配置文件时初始化了一次Singleton对象,并且在此之后从未改变过,那么我无法想到将其称为“反模式”的正当理由,而不是某种货物崇拜心态。

话虽这么说,当我需要将配置文件作为我的应用程序的对象提供时,我不使用Singleton。通常我将配置对象传递给需要它的那些对象/函数。

答案 1 :(得分:1)

我知道解决这个问题的最佳模式是通过一个选项类,它会在创建/配置时被注入到代码中。

步骤:

  1. 创建选项解析器类
  2. 配置解析器应该接受的参数和选项,以及它们的默认值(默认值可以是“最可能的”默认值)
  3. 编写客户端代码以接受选项作为参数(而不是单例和/或静态内容)。
  4. 在创建对象时注入选项。
  5. 查看boost.program_options已经成熟的程序选项模块。 如果您熟悉python,请查看examples in the doc of argparse(相同的概念,在python库中实现)。他们很容易从中获得概念和互动。

答案 2 :(得分:0)

运行时如果要在运行时读取配置,可以将它们存储在.ini文件中,并使用准备好的类库来解析和读取它们。然后将它们保存在程序的内存中以有效地访问它们。

<强>编译时 这样,您可以使用单独的头文件并将配置存储为const项。您可以使用constexternenum,...