关于自定义类的初始化程序的C ++混淆

时间:2017-10-27 12:39:04

标签: c++ class initializer-list

假设我想要一个名为Domain2D的自定义类。域将由内部Triangle的向量和名为Boundary2D的对象组成。 Boundary2D将包含LineSegment列表,每个三角形将包含三个V2个对象。每个V2对象都包含两个坐标。我们这样做:

以下为此类创建V2类和构造函数,以便我可以定义V2 vertex = V2 (5,-4);之类的对象。默认值为(0, 0)

class V2 {
public:
    long double x, y;
    V2(long double xx = 0, long double yy = 0);
};

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

我需要的下一件事是线段:

class LineSegment {
public:
    V2 v1, v2;
    LineSegment(V2 vv1 = V2(0, 0), V2 vv2 = V2(1, 0));
};

LineSegment::LineSegment(V2 VV1, V2 VV2) {
    v1 = VV1; v2 = VV2;
}

默认线段由顶点(0,0)和(1,0)组成。然后我需要一个三角形:

class Triangle {
public:
    V2 v1, v2, v3;
    Triangle(V2 vv1 = V2(0, 0), V2 vv2 = V2(1, 0), V2 vv3 = V2(0, 1));
};

Triangle::Triangle(V2 VV1, V2 VV2, V2 VV3) {
    v1 = VV1; v2 = VV2; v3 = VV3;
}

默认三角形由2D笛卡尔坐标中的标准单形格组成:(0, 0), (1, 0), (0, 1)。我们差不多完成了,我们只需要一个由线段组成的边界:

class Boundary2D {
public:
    std::vector<LineSegment> l;
    Boundary2D(std::vector<LineSegment> ll = {});
};

Boundary2D::Boundary2D(std::vector<LineSegment> lll) {
    l = lll;
}

默认边界为空({}),因此如果需要,我们可以立即push_back(...)

最后,一个域由边界和三角形矢量组成:

class Domain2D {
public:
    std::vector<Triangle> t;
    Boundary2D b;
    Domain2D(std::vector<Triangle> tt = {}, Boundary2D bb = Boundary2D({}));
};

Domain2D::Domain2D(std::vector<Triangle> ttt, Boundary2D bb) {
    t = ttt; b = bb;
}

现在问题出现了:编译器可以使用三角形的默认空向量,但它不能理解我对默认空边界的需要,我试图用Boundary2D bb = Boundary2D({})进行初始化。它说<function-style-cast>: cannot convert from 'initializer list' to 'Boundary2D'。我究竟做错了什么?创建这样的结构是不是这种方法?如果我希望它默认为空,那么边界的默认初始化程序应该是什么样的?感谢。

1 个答案:

答案 0 :(得分:1)

作为参考,违规行是

Domain2D(std::vector<Triangle> tt = {}, Boundary2D bb = Boundary2D({}));

尝试使用默认参数声明构造函数。

仔细研究一下,编译器输出实际上很简单。您实际上是在尝试使用C样式转换将初始化列表{}转换为类型为Boundary2D的对象。由于没有定义这样的转换运算符,它不起作用

只需将其替换为以下内容即可:

Domain2D(std::vector<Triangle> tt = {}, Boundary2D bb = {});