为了启动我的C ++程序,我需要阅读一些配置,例如IP地址,端口号,文件路径......这些设置可能会频繁更改(每周或每天!),因此将它们硬编码到源文件中并不是一个好主意。
经过一些研究,我很困惑是否有最佳实践从文件加载配置设置,并使这些配置可用于同一项目中的其他类/模块/ * .cpp。
static bad ;单身是坏(反模式?)那么,我们还有其他选择吗?或者,也许“配置文件”的想法是错误的?
编辑:我没有加载配置文件的问题。将所有这些设置加载到std :: map<之后我很担心string,string>在内存中,如何让其他类,函数访问这些设置。
编辑2:感谢大家的投入。我知道我在这里列出的这些模式是 FINE ,它们被许多程序使用。我很好奇是否有(某种) BEST 模式来处理程序的配置。
答案 0 :(得分:3)
可以说,配置文件是Singleton的合法用途。 Singleton模式通常不受欢迎,因为Singletons在多线程环境中引起竞争条件的问题,并且由于它们是全局可访问的,因此遇到了与globals相同的问题。但是,如果您在读取配置文件时初始化了一次Singleton对象,并且在此之后从未改变过,那么我无法想到将其称为“反模式”的正当理由,而不是某种货物崇拜心态。
话虽这么说,当我需要将配置文件作为我的应用程序的对象提供时,我不使用Singleton。通常我将配置对象传递给需要它的那些对象/函数。
答案 1 :(得分:1)
我知道解决这个问题的最佳模式是通过一个选项类,它会在创建/配置时被注入到代码中。
步骤:
查看boost.program_options已经成熟的程序选项模块。 如果您熟悉python,请查看examples in the doc of argparse(相同的概念,在python库中实现)。他们很容易从中获得概念和互动。
答案 2 :(得分:0)
运行时如果要在运行时读取配置,可以将它们存储在.ini
文件中,并使用准备好的类库来解析和读取它们。然后将它们保存在程序的内存中以有效地访问它们。
<强>编译时强>
这样,您可以使用单独的头文件并将配置存储为const
项。您可以使用const
,extern
,enum
,...