我正在编写一段代码,我想根据条件使用不同的类构造函数。到目前为止,我已经使用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
关键字但未成功。是否存在有条件地使用不同构造函数而不必重新定义构造函数的常用方法?
答案 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);
或者,如果arg1
和arg2
不是全球性的,
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
变量肯定不是你想要的。