Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+;中的指针和引用出现问题+;_C++_Pointers_Reference - Fatal编程技术网

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

C++ C+;中的指针和引用出现问题+;,c++,pointers,reference,C++,Pointers,Reference,我有一个多边形列表和一个多边形类型,它们是std::点列表或点列表 class Point { public: int x, y; Point(int x1, int y1) { x = x1; y = y1; } }; typedef std::list<Point> Polygon; typedef std::list<Polygon> Polyg

我有一个多边形列表和一个多边形类型,它们是std::点列表或点列表

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;
现在,我可以向currentPolygon添加点,但这些更改最终不会反映在polygonList中的同一个多边形中。currentPolygon只是polygonList前面的多边形的副本吗?当我稍后迭代多边形列表时,我添加到currentPolygon的所有点都不会显示

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

polygonList.front().push_front(somePoint);
为什么这些不相同?我如何创建对物理前多边形的引用而不是它的副本

像这样:

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

名称前的&符号表示这是一个引用。

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

typedef std::list<Point> Polygon;
typedef std::list<Polygon*> PolygonList;
typedef std::list Polygon;
typedef std::list PolygonList;
这样可以避免昂贵的复制。当然,您需要进行一些手动内存管理

 Polygon currentPolygon = polygonList.front();
因为类Polygon不会重载赋值操作符,所以编译器会默默地为您执行此操作,并在这一行实例化它


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

因此,我声明它时只需要“&”,而不是每次使用它后都需要“&”&是类型的一部分:“Polygon&”。所以,您只需要在声明时。大多数C++样式尝试将类型修饰符附加到类型:IE“多边形和当前”,即使实际语法是类型的,后面是修改的名称(因此,名称后面的[],函数指针的行噪声),我相信大多数STD::List实现浅拷贝,或者至少STD::SWAP-()。
 Polygon currentPolygon = polygonList.front();