其他结构中的结构构造函数

时间:2017-07-23 07:57:30

标签: c++

我正在尝试为某些给定点创建Voronoi图。每个点都有不同的属性,我想将其表示为颜色。为了用Boost Point概念映射我自己的Point结构,我编写了一些代码。我有以下设置:

struct Point {
  double a;
  double b;
  Point(double x, double y) : a(x), b(y) {}
};

// This Point structure is mapped to Boost Point concept. Code emitted 

我有另一种结构:

struct Point_Collection {
  Point xy(double x, double y);
  short color;

};

Visual Studio创建了一个自动定义:

Point Point_Collection::xy(double x, double y)
{
    return Point();
}

现在,如果我尝试将Point_collection的对象实例化为:

std::vector<Point_Collection> *test;
test = new std::vector<Point_Collection>();

Point_Collection xy_color;

for (int i = 0; i < 5000; i++) {
    xy_color.xy(rand() % 1000, rand() % 1000);
    xy_color.color = rand() % 17;
    test->push_back(xy_color);
}

我收到错误。

 error C2512: 'Point': no appropriate default constructor available

有人能指出我正确的方向,为什么会发生这种情况?

1 个答案:

答案 0 :(得分:3)

Point xy(double x, double y);Point_Collection中声明由<{1}}标识的成员函数,接受两个双打并按值返回xy个对象。

如果你想要一个包含点的简单聚合,那么C ++ 11及其后续方法就是这样定义:

Point

以上是使用值初始化语法的简单聚合初始化。你应该更喜欢它有两个原因:

  1. 不允许缩小转化次数。 (struct Point_Collection { Point xy; short color; }; Point_Collection xy_color{ { rand()%100, rand()%100 }, static_cast<short>(rand()%16)}; int是哪个,因此是演员。
  2. 易于实施。如果您的班级有所有公共成员,则不需要打字。
  3. (同样short在C ++ 11中有更好的选择,请查看标题rand

    如果您无权访问C ++ 11,那么您可以为<random>编写构造函数。

    Point_Collection

    或者使用聚合初始化和更详细的语法:

    struct Point_Collection {
      Point xy;
      short color;
    
      Point_Collection(Point xy, short color)
        : xy(xy), color(color) {}
    };
    
    Point_Collection xy_color (Point(...,...), ...);
    

    (由于以上是C ++ 03,struct Point_Collection { Point xy; short color; }; Point_Collection xy_color = { Point(rand()%100, rand()%100), rand()%16 }; 将被静默转换为rand()%16,尽管它正在缩小。)