我有许多类,我提供了一个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);
}
所需代码:
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);
}
当然,这里的问题是变量a
立即超出范围。所以我求助于分配给堆。
int main(int argc, const char* argv[]) {
...
A* a;
if(somecase)
a = new A(b1, c1);
else
a = new A(b1);
...
delete a;
}
如果我的目标是将其保留在堆栈中,这并不是很好。我还考虑了以下
A a(b1, somecase?c1:nullptr);
然后将条件组件转移到单个构造函数的主体中。这似乎不是很优雅。有没有更好的技术方法来做我想做的事情?最好给我在堆栈上分配 A 的选项。