从向量 C++ 中删除对象试图引用已删除的函数
Posted
技术标签:
【中文标题】从向量 C++ 中删除对象试图引用已删除的函数【英文标题】:delete object from vector c++ attempting to reference deleted function 【发布时间】:2019-12-05 02:24:40 【问题描述】:我一直在四处寻找是否有人与我有类似的问题,但我找不到任何东西。我提示用户输入他们希望删除的行星的名称。我的函数将定位行星在矢量对象中的位置。
这个函数的目的是根据我通过函数参数传递的位置删除一个对象。
行星类
class Planet
private:
string name;
double diameter;
double mass;
public:
const double G = 6.67408e-11;
void setName(string n);
bool setDiameter(double d);
bool setMass(double m);
string getName();
double getDiameter();
double getMass();
double CalcSa();
double CalcV();
double CalcDensity();
double CalcG();
string InputS(string x);
double InputD(string x);
Planet();
;
double ReadDouble(double input)
//Verifys that that user entered in a correct number
while (cin.fail() != 0)
cerr << "Enter a valid number: ";
cin.clear();
cin.ignore(255, '\n');
cin >> input;
return input;
string Planet::InputS(string x)
string user_input;
cout << x;
cin >> user_input;
return user_input;
double Planet::InputD(string x)
double user_input;
cout << x;
cin >> user_input;
user_input = ReadDouble(user_input);
return user_input;
Planet::Planet()
name;
diameter = 0.0;
mass = 0.0;
void Planet::setName(string n)
name = n;
bool Planet::setDiameter(double d)
bool rv = false;
if (d > 0.0)
rv = true;
diameter = d;
return rv;
bool Planet::setMass(double m)
bool rv = false;
if (m > 0.0)
rv = true;
mass = m;
return rv;
string Planet::getName()
return name;
double Planet::getMass()
return mass;
double Planet::getDiameter()
return diameter;
double Planet::CalcSa()
double sa = 4.0 * M_PI * pow((diameter / 2.0), 2.0);
return sa;
double Planet::CalcV()
double v = (4.0 / 3.0) * M_PI * pow((diameter / 2.0), 3.0);
return v;
double Planet::CalcDensity()
double den = mass / CalcV();
return den;
double Planet::CalcG()
double r = diameter / 2.0;
double grav = (G * mass) / (pow(r, 2.0));
return grav;
我的问题在于这行代码:
l.erase(l.begin() + n);
void DeleteVector(vector<Planet>& l, int n)
if (int len = l.size() > 0)
cout << l[n].getName() << " was removed from the list.\n";
l.erase(l.begin() + n);
我传入行星的向量,这是一个类。然后我传入我希望从对象向量中删除的位置“n”。
我收到以下错误:
Error C2280 'Planet &Planet::operator =(const Planet &)': attempting to reference a deleted function
任何帮助或指导将不胜感激。
【问题讨论】:
class Planet
的某些内容(未显示)导致无法重新分配对象,而vector<Planet>
需要在删除对象时将其元素移动到内存中。
@aschepler 我用我的班级行星更新了帖子
const double G = 6.67408e-11;
const
s 无法重新分配。如果此const
在实例之间没有变化,请考虑将其设为static const
。
我没有将其添加到我的答案中,因为它与问题无关,但if (int len = l.size() > 0)
可能既不是你认为的那样,也不会做你认为的那样反正感觉。如果l.size()
大于0,它将分配1
到len
,否则它将分配0
到len
。然后它将检查len
是否非零,如果是,则输入 if-body。基本上它只是检查l
是否为空。你可能想要if (n < l.size())
。
【参考方案1】:
您的类Planet
的复制赋值运算符被编译器隐式删除,因为它有一个const
成员。
见Deleted implicitly-declared copy assignment operator:
如果以下任何一项为真,则将类 T 的默认复制赋值运算符定义为删除:
T 有一个非类类型(或其数组)的非静态数据成员,即 const;
你可能是说G
是static const
:
static const double G;
然后在你的课堂之外:
const double Planet::G = 6.67408e-11;
【讨论】:
以上是关于从向量 C++ 中删除对象试图引用已删除的函数的主要内容,如果未能解决你的问题,请参考以下文章
VS2019 C++ 错误 C2280 试图引用已删除的函数 inl
Visual Studio 2013 和 2015 中的 C++ 编译器错误 C2280“试图引用已删除的函数”