代码之家  ›  专栏  ›  技术社区  ›  user16320

C++对自定义类初始值设定项的混淆

  •  0
  • user16320  · 技术社区  · 6 年前

    假设我想要一个名为 Domain2D . 域将由内部 Triangle 还有一个叫做 Boundary2D . 边界2D 将包括以下列表: 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;
    }
    

    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;
    }
    

    默认三角形由二维笛卡尔坐标中的标准单纯形组成: (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 回复  |  直到 6 年前
        1
  •  1
  •   user1781434 user1781434    6 年前

    作为参考,冒犯的界线是

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

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

    仔细看一下,编译器的输出实际上相当直接。您实际上是在尝试使用C样式转换来转换初始值设定项列表 {} Boundary2D . 由于没有定义此类转换运算符,因此它不起作用

    只需将其替换为以下内容,即可正常工作:

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