在此构造函数中initializer_list允许哪种初始化?

What sort of initialization does initializer_list allow for in this constructor?

本文关键字:许哪种 初始化 list 构造函数 initializer      更新时间:2023-10-16

我正在使用GUI库来阅读我正在阅读的教科书。其中一个用于"Lines"对象的构造函数具有以下代码。

struct Lines : Shape {  // independent lines
Lines() {}
Lines(initializer_list<Point> lst) : Shape{lst} { if (lst.size() % 2) error("odd number of points for Lines"); }
void draw_lines() const;
void add(Point p1, Point p2) { Shape::add(p1); Shape::add(p2); }
};

我尝试了以下初始化,但它显示了 E0289 错误,指出

no instance of constructor "Graph_lib::Lines::Lines" matches the argument list

Lines li{ {Point{100,100},Point{200,200}},{Point{150,150},Point{250,250}}};

我想知道initializer_list在这种情况下应该如何工作,以及在构造对象时应该如何使用它。

你实际上是在传递两个initializer_lists。未定义此构造,因此会出现编译错误。

Lines li{ {Point{100,100},Point{200,200}} , {Point{150,150},Point{250,250}} };
//        ^-----------------------------^                                       first        
//                                          ^-----------------------------^     second        

应编译以下更改:

  1. 构造函数中使用嵌套的初始值设定项列表:

    Lines(initializer_list<initializer_list<Point>> lst)
    
  2. 或 在构造函数中添加第二个参数,接受另一个初始值设定项列表:

    Lines(initializer_list<Point> lst, initializer_list<Point> lst2)
    
  3. OR调用中的两个初始值设定项列表合并为一个。

    Lines li{ { Point{100,100}, Point{200,200}, Point{150,150}, Point{250,250} } };
    //        ^----------------------------------------------------------------^
    //        one initializer-list
    

我想知道initializer_list在这种情况下应该如何工作,以及在构造对象时应该如何使用它。

鉴于类定义是由教科书提供的,您可能正在寻找上面的 #3,其中Point被分组为一个initializer-list

我猜它的 GUI 端可能是为了连接形成连接线的后续点,而不是接受形成单独线的点