扩展在if/else序列中初始化的变量的作用域
Expand scope of a variable initialized in a if/else sequence
我正在编写一段代码,其中我想根据条件使用不同的类构造函数。到目前为止,我已经使用if
和else
语句来构造对象,但是实例随后被"捕获"在括号中,不能在代码中进一步使用。
在代码中是这样的:
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);
或者,如果arg1
和arg2
不是全局的,
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
变量肯定不是您想要的。
相关文章:
- 初始值设定项列表是否只接受使用相同类型的值初始化变量?
- 在 C++ 中访问 lambda 捕获初始化变量
- 为什么C++不支持对未初始化变量进行智能分析?
- 使用 clang++ 和 g++ 在C++中初始化变量
- C++使用 lambda 初始化变量
- 如何在初始化列表中的构造函数之后初始化变量/对象?
- C++ - 输出与初始化变量不同?
- C++/Win32 构造函数不使用从对话框获取的字符串初始化变量
- 在C++中,为什么int可以使用new运算符初始化变量,而double不能
- 具有静态存储持续时间的常量初始化变量的初始化顺序
- C++ 中的初始化变量
- C++中未初始化变量的值
- 如何在需要提及需要循环声明的其他类的类中初始化变量?
- 我想知道在构造函数中初始化变量时的生命周期
- 读取恰好具有良好值的未初始化变量
- 如何在 getter 的父类中初始化变量的情况下访问子类中的变量
- 为什么在 c++ 中有多种初始化变量的方法
- 没有参数的默认构造函数是否总是初始化变量?
- 是否可以使用 lambda 初始化变量(删除复制 ctor 时)
- 使用构造函数跳闸UB的新放置后使用初始化变量