实际示例显然更长,但这总结了我的问题:
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的构造函数,因为规避不可复制性可能会使对象处于非法状态。通常,如果编译器认为有必要,您希望保留不可复制性。但是,我们在这里没有细节来充实这样的解决方案。