从向量 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&lt;Planet&gt; 需要在删除对象时将其元素移动到内存中。 @aschepler 我用我的班级行星更新了帖子 const double G = 6.67408e-11; consts 无法重新分配。如果此const 在实例之间没有变化,请考虑将其设为static const 我没有将其添加到我的答案中,因为它与问题无关,但if (int len = l.size() &gt; 0) 可能既不是你认为的那样,也不会做你认为的那样反正感觉。如果l.size() 大于0,它将分配1len,否则它将分配0len。然后它将检查len 是否非零,如果是,则输入 if-body。基本上它只是检查l 是否为空。你可能想要if (n &lt; l.size()) 【参考方案1】:

您的类Planet 的复制赋值运算符被编译器隐式删除,因为它有一个const 成员。

见Deleted implicitly-declared copy assignment operator:

如果以下任何一项为真,则将类 T 的默认复制赋值运算符定义为删除:

T 有一个非类类型(或其数组)的非静态数据成员,即 const;

你可能是说Gstatic const

static const double G;

然后在你的课堂之外:

const double Planet::G = 6.67408e-11;

【讨论】:

以上是关于从向量 C++ 中删除对象试图引用已删除的函数的主要内容,如果未能解决你的问题,请参考以下文章

VS2019 C++ 错误 C2280 试图引用已删除的函数 inl

Visual Studio 2013 和 2015 中的 C++ 编译器错误 C2280“试图引用已删除的函数”

试图找到已删除的函数

C++错误C2280 - 试图引用一个已删除的函数 - 在基元类型上。

从向量中删除对象会破坏 C++ 中另一个对象中的对象

从向量中删除取消引用的元素