在FLTK的C++中,为了定义一个圆,我们使用如下代码:
Circle c(Point(x,y), r);我们可以使用vector_ref将它们保存在向量中,比如:
Vector_ref<Circle> vc;
vc.push_back(new Circle(Point(x,y),r));好吧,那些都是关于圆环的,到现在还没有问题!三角形可以这样定义,用于代码中:
Graph_lib::polygon poly;
poly.add(Point(x1,y1),r1);
poly.add(Point(x2,y2),r2);
poly.add(Point(x3,y3),r3);这是拯救他们的载体:
Vector_ref<Graph_lib::Polygon> vp;问题是如何像圆圈那样使用triangles/polygons关键字保存/放入vp向量?
我用来回答第12号练习( 这里)的代码如下:
/* The binary-tree class, one of the topics that has been said in Programming Principles and Practice using C++ book by Biarne Stroustrup.
This code is written by R Abbasi (s.rabbasi@yahoo.com) */
#include <Simple_window.h>
#include <iostream>
vector <Graph_lib::Polygon> vpo;
vector <Point> vp;
int pow(int);
class Binary_tree: public Shape {
public:
Binary_tree(Point _p, int l):level(l), p(_p) {
preparing(); }
void preparing();
void put_nodes(Point);
void wheel(Point);
void make_nodes(Point);
void draw_lines() const {
for(int i = 0; i*2+2 < vp.size(); i++) {
fl_line(vp[i].x,vp[i].y, vp[i*2+1].x,vp[i*2+1].y);
fl_line(vp[i].x,vp[i].y, vp[i*2+2].x,vp[i*2+2].y);
}
}
private:
Point p;
int i, j, k, level;
double scale;
};
//**********************************
void Binary_tree::preparing() {
if(level < 1) error("Bad inputted level!");
else if (level == 1) put_nodes(p);
else {
scale = 5 * pow(level);
i = 1; j = 1; k = 3;
put_nodes(p);
make_nodes(p);
}
}
//***************************************
void Binary_tree::put_nodes(Point p) {
vp.push_back(p);
Graph_lib::Polygon poly;
poly.add(Point(p.x-2,p.y));
poly.add(Point(p.x,p.y-3));
poly.add(Point(p.x+3,p.y));
vpo.push_back(&poly);
}
//******************************************
void Binary_tree::wheel(Point p) {
put_nodes(Point(p.x - scale, p.y+30));
put_nodes(Point(p.x + scale, p.y+30));
}
//*****************************************
void Binary_tree::make_nodes(Point p) {
while(vp.size() < (pow(k)-1))
wheel(vp[vp.size()-i++]);
if(i < pow(level)) {
k++;
scale *= 1.0/2.0;
make_nodes(vp[vp.size()-i]);
}
}
//*********************
int pow(int l) {
int m = 2;
for(int k = 2; k < l; k++) m *= 2;
return m;
}
//***************************************
int main() try
{
Simple_window win(Point(),1300,500, "Binary_tree");
int level;
cout<< "Please enter the level of the Binary-tree:";
if(!(cin>>level)) error("Bad number of level!");
Point p(10*pow(level),20);
Binary_tree b_t(p,level);
vpo[0].set_color(Color::red);
vpo[0].set_style(Line_style(Line_style::solid,3));
win.attach(vpo[0]);
for(int i=1; i<vpo.size(); i++) {
vpo[i].set_color(Color::blue);
win.attach(vpo[i]);
}
win.attach(b_t);
win.wait_for_button();
return 0;
}
//*****************************
catch(exception& e) {
cerr << e.what() << "\n\a";
return 0;
}错误是:
*错误9错误C2664:'void C2664&)&):无法将参数1从'Graph_lib::Polygon *‘转换为'Graph_lib::Polygon &’c:\user\cs\documents\visual studio 2012\projects\test_1\test_1\test_1.cpp 53
14 IntelliSense:没有重载函数"std::vector<_Ty,_Alloc>::push_back with _Ty=Graph_lib::Polygon,_Alloc=std::allocator“的实例匹配参数列表参数类型是:(Graph_lib::Polygon )对象类型是: std::vector> c:\Users\CS\Documents\Visual 2012\Projects\test_1\test_1\test_1.cpp 53
发布于 2014-10-11 12:57:04
对于Vector_ref<polygon> (使用new)
据我对Vector_ref的了解,这只是一个带有指针和代码的std::vector,可以在最后清理动态分配的内存。这意味着您必须使用new来分配多边形。因此,如果您必须使用new,您可以先创建多边形(使用new),然后按它:
// Create your new polygon
polygon* poly = new polygon;
poly->add(Point(...));
poly->add(...);
poly->add(...);
// Push that polygon into the vector
vp.push_back(poly);std::vector<polygon*>的地址(取地址)
如果多边形没有超出作用域(即不离开函数或传递}),则可以获取多边形的地址:
// Create polygon
polygon poly;
poly.add(...); // by 3
// Add the polygon to the vector
vp.push_back(&poly);用于std::vector<polygon> (复制)
如果向量不是指针数组(这是std::vector<polygon>的情况,但不是std::vector<polygon*>或Vector_ref<polygon>),那么您不应该使用new或&。相反,如果您只使用向量的push_back与多边形,多边形将被复制到向量。
// Create your new polygon
polygon poly;
poly.add(...); // by 3
// Copy the polygon into the vector
vp.push_back(poly);https://stackoverflow.com/questions/26312079
复制相似问题