跨类共享配置对象的最佳方法是什么?

ste*_*ano 6 c++

让我们说我有M,A,B,C类.M是我的应用程序的主要类(这是完成大部分工作的那个)并具有这种结构

class M {
  public:
    // Something here.
  private:
    Conifg config;
    A a;
    std::vector<B> bs;
    const C* c;
};
Run Code Online (Sandbox Code Playgroud)

在一个主要的我创建一个M类的实例m,我想设置我的配置对象,比如从文件中读取它.配置对象没什么特别的,它可以是协议缓冲区或简单的结构.

现在,我希望a,b和c能够访问配置对象,因为它们需要一些全局设置.这些设置是全局的,它们不会改变,并且对于A,B和C(和M)的每个实例都是相同的.我目前正在做的是在每个类A,B和C中都有一个静态字段,我正在为这些类的每个实例设置一个配置对象的副本.我不希望这些类知道M.的存在.这是最好的解决方案吗?我是否应该想到一个全局配置变量?

jal*_*alf 9

只需将Config对象传递给A,B和C构造函数(具体而言,传递存储在M中的Config对象的引用).

这给你:

  • 可测试性(您可以轻松地交换配置对象以进行测试
  • 易于重用(你没有必须存在的全局变量的"不可见"依赖.所有A,B和C需要存在就是它们在构造函数中给出的内容
  • 灵活性(如果需要,可以创建不同的配置对象以传递给不同的类)
  • 可读性,因为阅读代码的人不必怀疑"配置对象来自哪里?还有谁可能改变了它?我能确定它已经被初始化了吗?".A,B和C类是独立的,可以单独阅读和理解.

但无论你做什么,都不要使用单例,并试图避免一般的静态/全局数据.


Rol*_*ice 4

我建议您使用额外的静态类进行配置,而不是所有类中的静态字段,在您想要的位置包含其标头。

实现一个静态构造函数,在其中初始化静态成员中所需的所有数据。我认为这将是一个更好的解决方案。

  • [Singletons:解决你不知道自 1995 年以来从未遇到过的问题](http://jalf.dk/blog/2010/03/singletons-solving-problems-you-didnt-know-you-never-had-since -1995/)。 (3认同)