在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/