gpt4 book ai didi

c++ - 是否可以在不编写复制构造函数的情况下在 main 中的构造函数之间进行选择?

转载 作者:可可西里 更新时间:2023-11-01 17:04:38 25 4
gpt4 key购买 nike

真实的例子显然要长得多,但这总结了我的问题:

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 的构造函数,因为规避不可复制性可能会使对象处于非法状态。通常,如果编译器认为有必要,您希望保留不可复制性。然而,我们在这里没有详细信息来充实这样的解决方案。

关于c++ - 是否可以在不编写复制构造函数的情况下在 main 中的构造函数之间进行选择?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22479977/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com