C ++类构造函数错误:尝试引用已删除的函数

时间:2017-11-02 05:50:32

标签: c++ class constructor syntax-error

这是我的代码产生错误(错误的真正原因/补救措施是在P.S.2中,但我仍然在寻找原因):

#include "stdafx.h"
#include <vector>

using namespace std;

class V2 {
public:
    long double x, y;
    V2(long double xx = 0, long double yy = 0);
    friend V2 operator+(const V2 &v1, const V2 &v2);
    friend V2 operator-(const V2 &v1, const V2 &v2);
    friend V2 operator*(const long double &r, const V2 &v);
    friend V2 operator*(const V2 &v, const long double &r);
    friend V2 operator/(const V2 &v, const long double &r);
};

V2::V2(long double X, long double Y) { x = X; y = Y; }

V2 operator+(const V2 &v1, const V2 &v2) { return V2(v1.x + v2.x, v1.y + v2.y); }

V2 operator-(const V2 &v1, const V2 &v2) { return V2(v1.x - v2.x, v1.y - v2.y); }

V2 operator*(const long double &r, const V2 &v) { return V2(r*v.x, r*v.y); }

V2 operator*(const V2 &v, const long double &r) { return V2(r*v.x, r*v.y); }

V2 operator/(const V2 &v, const long double &r) { return V2(v.x / r, v.y / r); }

long double Dot(const V2 &v1, const V2 &v2) { return v1.x*v2.x + v1.y*v2.y; }

long double Cross(const V2 &v1, const V2 &v2) { return v1.x*v2.y - v1.y*v2.x; }

long double DistanceSqr(const V2 &v1, const V2 &v2) { return Dot(v1 - v2, v1 - v2); }

long double Distance(const V2 &v1, const V2 &v2) { return sqrt(Dot(v1 - v2, v1 - v2)); }

class Face {
public:
    unsigned int v1, v2, v3;
    Face(int vv1 = 0, int vv2 = 0, int vv3 = 0);
};

Face::Face(int vv1, int vv2, int vv3) {
    v1 = vv1; v2 = vv2; v3 = vv3;
}

class LineSegment {
public:
    unsigned int v1, v2;
    LineSegment(int seg1 = 0, int seg2 = 0);
};

LineSegment::LineSegment(int seg1, int seg2) {
    v1 = seg1; v2 = seg2;
}

class Boundary2D {
private:
    long double threshold = 1e-7;
    unsigned int i, j;
public:
    vector<V2> p;
    vector<LineSegment> s;
    Boundary2D(vector<V2> po = {}, vector<LineSegment> seg = {});
};

Boundary2D::Boundary2D(vector<V2> po, vector<LineSegment> seg) {
    p = po; s = seg;
}

class Interior2D {
private:
    const long double threshold = 1e-7;
    unsigned int i, j;
public:
    vector<V2> p;
    vector<Face> f;
    Interior2D(vector<V2> po = {}, vector<Face> fa = {});
};

Interior2D::Interior2D(vector<V2> po, vector<Face> fa) {
    p = po; f = fa;
}

class Domain2D {
public:
    Boundary2D Boundary;
    Interior2D Interior;
    Domain2D(Boundary2D bnd = {}, Interior2D itr = {});
};

Domain2D::Domain2D(Boundary2D bnd, Interior2D itr) {
    Boundary = bnd; Interior = itr;
}

int main()
{
    return 0;
}

错误指向Domain2D构造函数“Interior = itr”(“=”标记为红色)内部,并显示:function "Interior2D::operator=(const Interior2D &)" (declared implicitly) cannot be referenced -- it is a deleted function'Interior2D &Interior2D::operator =(const Interior2D &)': attempting to reference a deleted function。我不知道这是什么意思,我认为它只是一个标准的构造函数,以防我需要定义一个新的Domain2D,如下所示:Domain2D d = Domain2D(some_bndry, some_interior)而不是d.Boundary = ...,{{1}这有点冗长。 Domain2D构造函数有什么大不了的,为什么它会引发错误呢?

P.S。:我发现在评论d.Interior = ...类的private:部分后,错误消失了。但是Interior2D类中有相同的部分,并且不会产生错误。此外,我需要这些变量(Boundary2Dij)来定义类中的一些函数(比如添加一个点,形成一个段或三角形等)。所以它真的归结为:为什么在类中使用私有:thresholdij变量会导致类构造函数引发错误?

P.S.2:我发现将threshold作为常规的长双变量(没有threshold),错误消失了。如果这是唯一的问题,问题是:为什么? const变量真的像一个常数,有助于判断两个双精度是否“相等”,我当然不希望它改变,它是一个常量。我们为什么不允许它保持不变?我听说如果变量保持不变,最好使变量保持不变。私有变量的常量与一些奇怪的“删除函数”错误有什么关系?

0 个答案:

没有答案