如何在C++中使用条件初始化对象正确获取资源?

rod*_*rod 0 c++ constructor

我有许多类,我提供了一个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的选项.

jua*_*nza 7

您可以使用条件运算符.例如,它允许你做一些你无法做的事情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)