扩展在if / else序列中初始化的变量的范围

时间:2014-07-08 17:33:21

标签: c++ scope

我正在编写一段代码,我想根据条件使用不同的类构造函数。到目前为止,我已经使用ifelse语句来构造对象,但实例在括号中被“捕获”,不能在代码中进一步使用。

以下是代码中的内容:

if (my_boolean){
    MyClass my_object(arg1); //calling a first constructor
}
else {
    MyClass my_object(arg1,arg2); //calling another constructor
}
//more code using my_object

到目前为止,我尝试使用static关键字但未成功。是否存在有条件地使用不同构造函数而不必重新定义构造函数的常用方法?

3 个答案:

答案 0 :(得分:7)

尝试以下方法:)

MyClass my_object = my_boolean ? MyClass(arg1) : MyClass(arg1,arg2);

考虑到即使该类没有默认构造函数,此代码也能正常工作。

这是一个示范性的例子

#include <iostream> 
#include <cstdlib>
#include <ctime>

int main () 
{
    struct Point
    {
        Point( int x ) : x( x ) {}
        Point( int x, int y ) : x( x ), y( y ) {}
        int x = 0;
        int y = 0;
    };

    std::srand( ( unsigned )std::time( 0 ) );

    Point p = std::rand() % 2 ? Point( 1 ) : Point( 1, 2 );

    std::cout << "p.x = " << p.x << ", p.y = " << p.y << std::endl;  

    return 0; 
}

我得到了以下输出

p.x = 1, p.y = 2

你得到了什么输出? :)

答案 1 :(得分:6)

如果要使用给定范围之外的变量,则必须在该范围之外声明它。

void foo()
{
    MyClass my_object;
    if (my_boolean){
        my_object = MyClass(arg1); //calling a first constructor,
                                   //then copy or move assignment
    }
    else {
        my_object = MyClass(arg1,arg2); //calling another constructor,
                                   //then copy or move assignment
    }
    //more code using my_object
}
//Can no longer access my_object

如果您想这样做,我建议您定义一个move assignment operator,如果默认设置不适用于您的目的(或者没有默认的移动分配操作符)。

此外,如果将my_object / if块和对象构造移动到单独的函数,则使用else的代码可能更清晰,然后执行以下操作:

MyClass my_object = make_object(my_boolean);

或者,如果arg1arg2不是全球性的,

MyClass my_object = make_object(my_boolean, arg1, arg2);

如果创建对象比您在此处提出的要复杂得多,您可能希望查看factory pattern

答案 2 :(得分:5)

您可以使用智能指针代替直接实例:

std::unique_ptr<MyClass> my_object;

if (my_boolean) {
     //calling a first constructor
    my_object.reset(new MyClass(arg1));
}
else {
    //calling another constructor
    my_object.reset(new MyClass(arg1,arg2));
}
//more code using my_object

与此处提出的其他一些解决方案相比,这也适用于较大的if() {} else if() {}序列或switch块。


如果您不能使用符合最新标准的编译器,您可以使用完全相同的旧版std::auto_ptr

  

&#34;到目前为止,我尝试使用static关键字但未成功。&#34;

好的! static变量肯定不是你想要的。