【问题标题】:delete object from vector c++ attempting to reference deleted function从向量 C++ 中删除对象试图引用已删除的函数
【发布时间】: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())

标签: c++ object vector


【解决方案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;

【讨论】:

    猜你喜欢
    • 2020-07-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多