C++ 在自动存储和异常中没有无参数构造函数的类的对象

C++ 在自动存储和异常中没有无参数构造函数的类的对象,c++,exception,c++17,C++,Exception,C++17,我有一个工厂方法,它返回类类型的对象 MyClass factory(string param1, ...) { ... MyClass instance(param1); ... if (smth) throw ...; ... return instance; } 工厂方法可能会抛出错误 我正在尝试创建具有异常处理的此类对象。大概是这样的: MyClass obj; try { obj = factory(...); } catch (...) { co

我有一个工厂方法,它返回类类型的对象

MyClass factory(string param1, ...) {
  ...
  MyClass instance(param1);
  ...
  if (smth) throw ...;
  ...
  return instance;
}
工厂方法可能会抛出错误

我正在尝试创建具有异常处理的此类对象。大概是这样的:

MyClass obj;
try {
   obj = factory(...);
} catch (...) {
   cout << "oops..." << endl;
}
当然,问题是,这在MyClass obj创建实例时不起作用,但我希望避免创建实例,因为这会耗费时间和资源

也许我可以将factory的返回类型更改为MyClass*,但是我需要面对new和delete

有没有一种方法可以在不新建和创建临时实例的情况下执行此操作,但可以进行异常处理?

如何:

try {
   MyClass obj = factory(...);
   DoJob(obj);
} catch (...) {
   cout << "oops..." << endl;
}
那么:

try {
   MyClass obj = factory(...);
   DoJob(obj);
} catch (...) {
   cout << "oops..." << endl;
}
您可以从C++17开始使用

重点矿山

类模板std::optional管理包含的可选 价值

如果可选项包含值,则该值保证为 作为可选对象示意图的一部分分配,即无动态 内存分配从未发生过。因此,可选对象为 对象,而不是指针,即使运算符*和运算符->是 定义

e、 g

顺便说一句:如果你只是不想手动处理新建和删除,这也是一个不错的选择。

你可以从C++17开始使用

重点矿山

类模板std::optional管理包含的可选 价值

如果可选项包含值,则该值保证为 作为可选对象示意图的一部分分配,即无动态 内存分配从未发生过。因此,可选对象为 对象,而不是指针,即使运算符*和运算符->是 定义

e、 g


顺便说一句:如果你只是不想手动处理新建和删除,这也是一个不错的选择。

非常感谢。可选的看起来和我需要的完全一样。似乎std::可选工厂。。。这是有道理的。或者std::变体工厂…非常感谢。可选的看起来和我需要的完全一样。似乎std::可选工厂。。。这是有道理的。或者std::变体工厂…谢谢。我想分开关注点-我不希望DoJob出现异常,所以希望它出厂时出现异常。谢谢。我想分离关注点-我不希望DoJob出现异常,所以希望它出现出厂异常。