声明变量,其类型具有已删除的默认构造函数,没有值
Declare variable, whose type has an deleted default constructor, without a value
我想在多个if-else分支中初始化一个变量,以备后用,基本上是这样的:
Foo foo;
if (someCondition) {
std::string someString = getTheString();
// do some stuff
foo = Foo(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
foo = Foo(someInt);
}
// use foo here
不幸的是,在此示例中,类型 Foo
具有已删除的默认构造函数,因此上面的代码无法编译。有没有办法以这种方式初始化这样的变量?
编辑:
正如您在我的示例中所看到的,我使用了不同的构造函数并且还在 if/else 块中做了其他事情,所以不幸的是三元运算符不起作用。
如果没有办法,没有 foo
作为指针,我显然可以采取不同的方法,但我很好奇,如果我的方法以某种方式起作用。
您还没有告诉我们为什么您不能使用指针...但是,与此同时,这是一个表面上没有指针的解决方案:
#include <optional>
std::optional<Foo> foo;
if (someCondition) {
std::string someString = getTheString();
// do some stuff
foo.emplace(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
foo.emplace(someInt);
}
if (foo.has_value()) { /* use foo here */ }
如果您有编码标准或禁止使用 raw 指针(和 new
)的东西,那么您可以使用 std::unique_ptr
。
#include <memory>
std::unique_ptr<Foo> foo;
if (someCondition) {
std::string someString = getTheString();
// do some stuff
foo = std::make_unique<Foo>(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
foo = std::make_unique<Foo>(someInt);
}
if (foo) {/* use foo here */}
您还可以将 Foo
创建逻辑放在单独的函数(或 lambda)中:
auto getFoo(/* ... */) {
if (someCondition) {
std::string someString = getTheString();
// do some stuff
return Foo(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
return Foo(someInt);
}
}
// ...
Foo foo = getFoo(/*...*/);
// use foo here
我想在多个if-else分支中初始化一个变量,以备后用,基本上是这样的:
Foo foo;
if (someCondition) {
std::string someString = getTheString();
// do some stuff
foo = Foo(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
foo = Foo(someInt);
}
// use foo here
不幸的是,在此示例中,类型 Foo
具有已删除的默认构造函数,因此上面的代码无法编译。有没有办法以这种方式初始化这样的变量?
编辑:
正如您在我的示例中所看到的,我使用了不同的构造函数并且还在 if/else 块中做了其他事情,所以不幸的是三元运算符不起作用。
如果没有办法,没有 foo
作为指针,我显然可以采取不同的方法,但我很好奇,如果我的方法以某种方式起作用。
您还没有告诉我们为什么您不能使用指针...但是,与此同时,这是一个表面上没有指针的解决方案:
#include <optional>
std::optional<Foo> foo;
if (someCondition) {
std::string someString = getTheString();
// do some stuff
foo.emplace(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
foo.emplace(someInt);
}
if (foo.has_value()) { /* use foo here */ }
如果您有编码标准或禁止使用 raw 指针(和 new
)的东西,那么您可以使用 std::unique_ptr
。
#include <memory>
std::unique_ptr<Foo> foo;
if (someCondition) {
std::string someString = getTheString();
// do some stuff
foo = std::make_unique<Foo>(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
foo = std::make_unique<Foo>(someInt);
}
if (foo) {/* use foo here */}
您还可以将 Foo
创建逻辑放在单独的函数(或 lambda)中:
auto getFoo(/* ... */) {
if (someCondition) {
std::string someString = getTheString();
// do some stuff
return Foo(someString);
} else {
int someInt = getTheInt();
//do some other stuff maybe
return Foo(someInt);
}
}
// ...
Foo foo = getFoo(/*...*/);
// use foo here