扩展在if/else序列中初始化的变量的作用域

Expand scope of a variable initialized in a if/else sequence

本文关键字:初始化 变量 作用域 if else 扩展      更新时间:2023-10-16

我正在编写一段代码,其中我想根据条件使用不同的类构造函数。到目前为止,我已经使用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关键字没有成功到目前为止。是否有一种共同的方式,有条件地使用不同的构造函数,而不必重新定义构造函数?

尝试以下操作:)

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

你得到了什么输出?:)

如果要在给定作用域之外使用变量,则必须在该作用域之外声明该变量。

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

如果你想这样做,我建议定义一个移动赋值操作符,如果默认值不能满足你的目的(或者没有默认的移动赋值操作符)。

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

MyClass my_object = make_object(my_boolean);

或者,如果arg1arg2不是全局的,

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

如果创建对象比您在这里询问的更复杂,您可能希望查看工厂模式。

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

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

"我尝试使用static关键字,但到目前为止没有成功。"

那么好!static变量肯定不是您想要的。