我正在尝试为某些给定点创建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
有人能指出我正确的方向,为什么会发生这种情况?
答案 0 :(得分:3)
Point xy(double x, double y);
在Point_Collection
中声明由<{1}}标识的成员函数,接受两个双打并按值返回xy
个对象。
如果你想要一个包含点的简单聚合,那么C ++ 11及其后续方法就是这样定义:
Point
以上是使用值初始化语法的简单聚合初始化。你应该更喜欢它有两个原因:
struct Point_Collection {
Point xy;
short color;
};
Point_Collection xy_color{ { rand()%100, rand()%100 }, static_cast<short>(rand()%16)};
到int
是哪个,因此是演员。(同样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
,尽管它正在缩小。)