В C++ от FLTK, за да дефинираме кръг, използваме код като този:
Circle c(Point(x,y), r);
И можем да използваме vector_ref да ги поставим и запазим във вектор, като:
Vector_ref<Circle> vc;
vc.push_back(new Circle(Point(x,y),r));
Добре, това бяха за Circle и досега нямаше проблем! Триъгълникът може да бъде дефиниран така за използване в кодове:
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 вектор, като използвате ключова дума new
, както прави кръгът?
Кодът, който използвах като отговор на упражнение № 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 ([email protected]) */
#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 std::vector‹_Ty>::push_back(Graph_lib::Polygon &&)': не може да конвертира параметър 1 от 'Graph_lib::Polygon *' в 'Graph_lib::Polygon &&' c:\ потребители\cs\documents\visual studio 2012\projects\test_1\test_1\test_1.cpp 53
14 IntelliSense: няма екземпляр на претоварена функция "std::vector‹_Ty, _Alloc>::push_back [с _Ty=Graph_lib::Polygon, _Alloc=std::allocator]" съответства на списъка с аргументи Типовете аргументи са: (Graph_lib:: Многоъгълник ) тип обект е: std::vector> c:\Users\CS\Documents\Visual Studio 2012\Projects\test_1\test_1\test_1.cpp 53
new
? Ако го направите, трябва да кажете защо. И обяснете как работи натискането наCircle
указател във вектор отCircles
. - person juanchopanza   schedule 11.10.2014new
. В противен случай трябва да подадете временен обект без ключовата думаnew
и функцията ще направи копие на този обект. Това описание е опростено - трябва да имате уводна книга за C++ през първите 6 месеца от изучаването на C++. - person rwong   schedule 11.10.2014