我有许多类,我提供了一个Init()函数.鉴于使用此代码的程序员可能忘记调用Init(),或者之前可能调用析构函数Init(),我已经编写了析构函数来检查对象的状态.我觉得这写得不是很好,如果可能的话,想通过初始化和分配构造函数中所需的一切来避免这种情况(Scott Meyers建议也不要使用初始化方法).然而,当使用可选参数/多个构造函数时,我一直在努力寻找一种方法.
当前代码:
class A {
Init(B* some_other_object);
Init(B* some_other_object, C* an_optional_argument);
...
}
int main(int argc, const char* argv[]) {
...
A a;
if(somecase)
a.Init(b1, c1);
else
a.Init(b1);
}
Run Code Online (Sandbox Code Playgroud)
期望的代码:
class A {
explicit A(B* some_other_object);
A(B* some_other_object, C* an_optional_argument);
...
}
int main(int argc, const char* argv[]) {
...
if(somecase)
A a(b1, c1);
else
A a(b1);
}
Run Code Online (Sandbox Code Playgroud)
当然,这里的问题是变量a立即超出范围.所以我求助于分配给堆.
int main(int argc, const char* argv[]) {
...
A* a;
if(somecase)
a = new A(b1, c1);
else
a = new A(b1);
...
delete a;
}
Run Code Online (Sandbox Code Playgroud)
如果我的目标是将其保留在堆栈中,这不是很好.我也考虑过以下几点
A a(b1, somecase?c1:nullptr);
Run Code Online (Sandbox Code Playgroud)
然后将条件组件移动到单个构造函数的主体中.这似乎并不十分优雅.有没有更好的技术方法来做我想做的事情?最好给我一个在堆栈上分配A的选项.
您可以使用条件运算符.例如,它允许你做一些你无法做的事情if-else.假设这个简单的类有两个构造函数,
struct Foo
{
explicit Foo(int) {}
Foo(int, int) {}
};
Run Code Online (Sandbox Code Playgroud)
你可以根据这样的条件初始化类的实例:
int i = ....;
Foo f = (i==42) ? Foo(42) : Foo(1, 2);
Run Code Online (Sandbox Code Playgroud)