C++:如何根据条件选择构造函数?

标签 c++ scope

假设我有一个具有不同构造函数的类:

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/

相关文章:

c++ - 这个回调有什么问题?

javascript - 覆盖 Javascript 函数中的回调

Javascript html 从外部文件调用外部对象

ruby-on-rails - Rails 4-Pundit-索引范围的策略

XPages:应用程序范围变量的生命周期是多少?

javascript - 我可以从作用域之外访问作用域变量吗?

c++ - 关于 std::reduce vs2017 中的未知数?

c++ - 在 .Net C++ 中将 EventHandler 转换为 MouseEventHandler?

c++ - 编译器没有将我的对象识别为其类类型

c++ - 模数公式