使用C ++中的指针和引用时出现问题

时间:2009-02-13 04:20:57

标签: c++ pointers reference

我有一个PolygonList和一个Polygon类型,它们是std :: Points列表或点列表。

class Point {
    public:
        int x, y;
        Point(int x1, int y1)
        {
            x = x1;
            y = y1;
        }
};

typedef std::list<Point> Polygon;
typedef std::list<Polygon> PolygonList;


// List of all our polygons
PolygonList polygonList;

但是,我对引用变量和指针感到困惑。

例如,我希望能够在我的polygonList中引用第一个Polygon,并将一个新Point推送到它。

所以我试图将polygonList的前面设置为一个名为currentPolygon的Polygon,如下所示:

 Polygon currentPolygon = polygonList.front();
 currentPolygon.push_front(somePoint);

现在,我可以为currentPolygon添加点,但这些更改最终没有反映在polygonList中的同一个多边形中。 currentPolygon只是polygonList前面的Polygon的副本吗?当我稍后迭代polygonList时,我没有显示我添加到currentPolygon的所有点。

如果我这样做,它会起作用:

polygonList.front().push_front(somePoint);

为什么这些不相同?如何创建对物理前多边形的引用而不是它的副本?

3 个答案:

答案 0 :(得分:6)

像这样:

 Polygon &currentPolygon = polygonList.front();
 currentPolygon.push_front(somePoint);
&amp;&amp;名称前面的符号表示这是一个参考。

答案 1 :(得分:1)

 Polygon currentPolygon = polygonList.front();

由于类Polygon不会重载赋值运算符,因此编译器会默默地为您执行此操作并在此行实例化它。

在编译器引入的版本中实现的赋值运算符的默认行为是制作对象的副本。

答案 2 :(得分:0)

您应该首先将列表定义为指针列表:

typedef std::list<Point> Polygon;
typedef std::list<Polygon*> PolygonList;

这避免了昂贵的复制。当然,您需要进行一些手动内存管理。