假设我有一个具有不同构造函数的类:
class A
{
public:
A(char* string)
{
//...
}
A(int value)
{
//..
}
void check() {}
};
现在我想在堆栈上创建一个 A 对象,必须根据某些条件选择构造函数,但是有一个问题:创建的对象被销毁,然后我们退出 {...} block 。
bool isTrue() { /*...*/ }
int main()
{
if (isTrue())
{
A a("string");
}
else
{
A a(10);
}
a.check(); //error: 'a' is not defined in this scope
}
假设我在 A
类中没有复制构造函数或 operator=
。那么如何解决这个问题呢?
http://ideone.com/YsjmnK
最佳答案
A a = isTrue() ? A("字符串") : A(10);
如果 a.check()
是一个 const 成员函数,替代方案可能会更好:
const A& a = isTrue() ? A("字符串") : A(10);
当引用 a
超出范围时,对象将被销毁。
注意自 C++17 起,根据 copy elision 的规则在这种情况下,复制/移动构造函数不需要可访问;这里保证复制省略。
从 C++17 开始,您可以使用 std::optional ,这不会导致任何动态内存分配。例如
std::optional<A> a;
if (isTrue())
{
a.emplace("string");
}
else
{
a.emplace(10);
}
(*a).check();
顺便说一句:A(char* string)
应该是 A(const char* string)
。
关于C++:如何根据条件选择构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22063052/