首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Push_back(新三角形)

Push_back(新三角形)
EN

Stack Overflow用户
提问于 2014-10-11 07:10:49
回答 1查看 857关注 0票数 0

在FLTK的C++中,为了定义一个圆,我们使用如下代码:

代码语言:javascript
复制
Circle c(Point(x,y), r);

我们可以使用vector_ref将它们保存在向量中,比如:

代码语言:javascript
复制
Vector_ref<Circle> vc;
vc.push_back(new Circle(Point(x,y),r));

好吧,那些都是关于圆环的,到现在还没有问题!三角形可以这样定义,用于代码中:

代码语言:javascript
复制
Graph_lib::polygon poly;
poly.add(Point(x1,y1),r1);
poly.add(Point(x2,y2),r2);
poly.add(Point(x3,y3),r3);

这是拯救他们的载体:

代码语言:javascript
复制
Vector_ref<Graph_lib::Polygon> vp;

问题是如何像圆圈那样使用triangles/polygons关键字保存/放入vp向量?

我用来回答第12号练习( 这里)的代码如下:

代码语言:javascript
复制
/* 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

EN

回答 1

Stack Overflow用户

发布于 2014-10-11 12:57:04

对于Vector_ref<polygon> (使用new)

据我对Vector_ref的了解,这只是一个带有指针和代码的std::vector,可以在最后清理动态分配的内存。这意味着您必须使用new来分配多边形。因此,如果您必须使用new,您可以先创建多边形(使用new),然后按它:

代码语言:javascript
复制
// 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*>的地址(取地址)

如果多边形没有超出作用域(即不离开函数或传递}),则可以获取多边形的地址:

代码语言:javascript
复制
// 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与多边形,多边形将被复制到向量。

代码语言:javascript
复制
// Create your new polygon
polygon poly;
poly.add(...); // by 3

// Copy the polygon into the vector
vp.push_back(poly);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26312079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档