实际示例显然更长,但这总结了我的问题:

class Object
{
 int mInt1,mInt2;
 Object::Object();
 Object::Object(int param1);
 Object::Object(int param1, int param2);
};
Object::Object(){}
Object::Object(int param1):mInt1(param1){}
Object::Object(int param1, int param2):mInt1(param1),mInt1(param2){}

然后在主要:
if (type1){
  Object instance(param1);
}
else{
  Object instance(param1,param2);
}
// do stuff with instance

哎呀!那是行不通的,实例超出了后续程序的范围。
Object instance;
if (type1){
  instance = Object(param1);
}
else{
  instance = Object(param1,param2);
}
// do stuff with instance

但是现在我遇到麻烦了,因为我没有定义副本构造函数。我真的不想写一个复制构造函数,因为我的实际类有几十个成员,其中许多是非基本类型的,可能需要更多的工作才能复制。

具体来说,我正在
main.cpp: error: use of deleted function ‘Object& Object::operator=(Object&&)’
         instance = Object(param1);
                  ^
note: ‘Object& Object::operator=(Object&&)’ is implicitly deleted because the default definition would be ill-formed:

最佳答案

处理不可复制对象的通用方法是将其放入unique_ptr(或auto_ptr,具体取决于您的编译器)。

  std::unique_ptr<Object> instance;

  if (type1) {
    instance.reset(new Object(i));
  }
  else {
    instance.reset(new Object(i, j));
  }

在这里使用原始指针确实是不安全的,因为一旦您开始必须处理异常或任何有趣的代码路径,就变得很担心泄漏。相信我,在100%的情况下,如果您将其放在unique_ptr 中,您的工作量和代码行将减少。

最佳解决方案是重新设计Object的构造函数,因为规避不可复制性可能会使对象处于非法状态。通常,如果编译器认为有必要,您希望保留不可复制性。但是,我们在这里没有细节来充实这样的解决方案。

07-24 09:45
查看更多