配置结构与setter

pmr*_*pmr 6 c++

我最近遇到了使用配置对象而不是通常的setter方法进行配置的类.一个小例子:

class A {  
   int a, b;  
public:  
   A(const AConfiguration& conf) { a = conf.a; b = conf.b; }  
};  

struct AConfiguration { int a, b; };
Run Code Online (Sandbox Code Playgroud)

好处:

  • 您可以扩展您的对象,并轻松保证新值的合理默认值,而无需用户需要了解它.
  • 您可以检查配置的一致性(例如,您的类只允许某些值组合)
  • 通过省略setter来节省大量代码.
  • 您将获得一个默认构造函数,用于为Configuration结构指定默认构造函数并使用A(const AConfiguration& conf = AConfiguration()).

缺点:

  • 您需要在构建时知道配置,以后不能更改它.

我缺少更多的缺点吗?如果没有:为什么不经常使用?

sbi*_*sbi 7

无论是单独传递数据还是按结构传递数据都是一种风格问题,需要根据具体情况来决定.

重要的问题是:对象在构造之后是否已准备好并且可用,编译器是否强制将所有必要的数据传递给构造函数,或者您是否必须记住在构造之后调用一堆setter,其编号可能随时增加没有编译器给你任何提示你需要调整你的代码.所以这是否是

 A(const AConfiguration& conf) : a(conf.a), b(conf.b) {}
Run Code Online (Sandbox Code Playgroud)

要么

 A(int a_, int b_) : a(a_), b(b_) {}
Run Code Online (Sandbox Code Playgroud)

并不重要.(有很多参数,每个人都更喜欢前者,但这个数字是多少 - 以及这样的类是否设计得很好 - 是值得商榷的.)但是,我是否可以使用这样的对象

A a1(Configuration(42,42));
A a2 = Configuration(4711,4711);
A a3(7,7);
Run Code Online (Sandbox Code Playgroud)

或者必须这样做

A urgh;
urgh.setA(13);
urgh.setB(13);
Run Code Online (Sandbox Code Playgroud)

在我可以使用该对象之前,确实会产生巨大的差异.特别是当有人出现并添加另一个数据字段时A.