代码之家  ›  专栏  ›  技术社区  ›  Alex Netkachov

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

  •  0
  • Alex Netkachov  · 技术社区  · 7 年前

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

    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 .

    新的 创建一个临时实例,但有异常处理?

    2 回复  |  直到 7 年前
        1
  •  2
  •   songyuanyao    7 年前

    你可以用 std::optional

    (强调我的)

    标准::可选 管理包含的可选 价值。。。

    如果 optional<T> 包含一个值,该值保证 作为可选对象封装外形的一部分分配,即。 内存分配从未发生过。因此,一个可选对象对 对象,而不是指针 ,即使运算符*()和运算符->()是 定义。

    std::optional<MyClass> obj;
    try {
       obj = factory(...);
    } catch (...) {
       cout << "oops..." << endl;
    }
    

    顺便说一句:如果你只是不想处理 new delete 手动操作, smart pointers 也是个不错的选择。

        2
  •  2
  •   Jarod42    7 年前

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