在C++ 11之前的版本中,您没有非静态成员初始化,也没有构造委托(delegate),因此人们经常使用私有(private)帮助器函数来帮助初始化,以减少代码复制。

这是2018年的好代码吗?

class A  {
  int a1 = 0;
  double a2 = 0.0;
  string a3 = "";
  unique_ptr<DatabaseHandle> upDBHandle;

  void init(){
      upDBHandle = open_database(a1, a2, a3);
  }

public:
    A() { init(); }
    explicit A(int i):a1(i) {  init(); }
    explicit A(double d):a2(d) {  init(); }
    explicit A(std::string s):a3(std::move(s)) {  init(); }
    A(int i, double d, std::string s) : a1(i), a2(d), a3(std::move(s)) { init(); }
};

如何改进此代码?

最佳答案

C++不能很好地处理多个默认值。因此,要做到这一点绝非易事。您可以做不同的事情,但是所有这些事情都有不同的取舍(例如,分散默认值)。

恕我直言,最好的解决方案可以在这里得到,它不是一个合法的C++(至今),但是是一个受高度支持的扩展:指定的初始化程序。

class A  {
  struct Params {
      int a1 = 0;
      double a2 = 0.0;
      string a3 = "";
  };
  Params p;
  unique_ptr<DatabaseHandle> upDBHandle;

public:
    explicit A(Params p_arg)
      : p(std::move(p_arg))
      , upDBHandle(open_database(p.a1, p.a2, p.a3) { }
};

A a({});  // uses all defaults
A a2({.a2 = 0.5});  // specifies a2 but leaves a1 and a3 at default
A a3({.a1 = 2, .a2=3.5, .a3 = "hello"});  //  specify all

关于c++ - 在2018年C++ 11及更高版本中,helper init()函数是否被视为错误形式?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48349823/

10-11 00:36