从配置文件中检索变量的最佳C++实践



用例非常常见:我有一些变量应该可以全局访问(由各种类访问(,并从配置文件初始化。我无法决定做这件事的最佳方式。

  1. Options结构由某人拥有并传递:
struct Opts {
int op1;
double op2;
};
int main() {
Opts o = {3, 0.5};
// Pass this around as const reference, or potentially copying
return 0;
}
  1. 对某些Options结构使用静态变量
struct Opts {
inline static int op1;
inline static double op2;
};
int main() {
Opts::op1 = 3;
Opts::op2 = 0.5;
// No passing around, but use Opts::op1 instead
return 0;
}
  1. 使用静态变量,但排序不同(不是真的(
struct Opts {
static int op1;
static double op2;
};
int Opts::op1;
double Opts::op2;
int main() {
Opts::op1 = 3;
Opts::op2 = 0.5;
// No passing around, but use Opts::op1 instead
return 0;
}

我到底应该在这里做什么?我认为最好的情况是静态常量变量,以确保没有人更改这些值,但这些值只能从某个文件中获得(因此似乎必须是运行时而不是编译时(,即使它们在初始化后不会更改。

如果我不使它成为静态的,我可以使它成为const-refs,但这只是迫使我在许多类中传递这一点。我还希望拥有这些选项的类与解析它们的类不同。无论是移动unique_ptr还是复制,这都会更加丑陋。

有没有办法两全其美:

  1. 不必过度地传递事物(因此
  2. 确保它们在初始化后不能被修改,至少表明情况是这样的(因此"const"的语义(

我通常使用singleton类。config对象在启动时被实例化,它读取文件的内容。它包含";getters";其将值返回给您,并且它还可能包含";setters";允许更改这些值–在这种情况下,它还会重写底层文件。设置文件简单地说明了这个对象";持久性";从一次跑步到下一次跑步。

对象还负责检查设置的内容,以确保它们是正确的。如果有人错误地编辑了文件,那么对象将抛出一个有意义的异常。因此,如果这样做,您就知道设置文件是好的。";setters";同样可疑:如果程序的其他部分试图存储不正确的值,则对象将捕获该尝试并抛出异常。

最新更新