我保证今晚的最后一个问题.这些指针给我带来了严重的麻烦.
我有一个
typedef std::listPolygon; typedef std::list PolygonList; // List of all our polygons PolygonList polygonList;
我创建了下面的方法,尝试从(x,y)中删除最近的点,检查我的polygonList中的所有多边形.
void deleteNearestPoint(int x, int y) { y = screenHeight - y; Polygon &closestPolygon = polygonList.front(); Polygon::iterator closestPoint = closestPolygon.begin(); float closestDistance = sqrt(pow(x - closestPoint->x, 2) + pow(y - closestPoint->y, 2)); // Search PolygonList PolygonList::iterator listIter; Polygon::iterator iter; for(listIter = polygonList.begin(); listIter != polygonList.end(); listIter++) { Polygon &tempPolygon = *listIter; for(iter = tempPolygon.begin(); iter != tempPolygon.end(); iter++) { const float distance = sqrt(pow(x - iter->x, 2) + pow(y - iter->y, 2)); if (distance < closestDistance) { closestPolygon = *listIter; closestPoint = iter; closestDistance = distance; } } } closestPolygon.erase(closestPoint); redraw(); }
但是,在某个地方,我有一个指针或参考变量搞砸了我.此代码编译但以非常奇怪的方式执行.
我编写了一个调试语句,假设我的多边形列表中有3个多边形,如下所示:
多边形#:0
点:(448,43)
点:(469,177)
点:(374,123)
多边形#:1
点:(295,360)
点:(422,350)
点:(315,266)
点:(295,360)
多边形#:2
点:(143,202)
点:(301,203)
点:(222,100)
点:(143,202)
现在,让我说我尝试使用删除函数给它一个x/y接近点422,350所需的结果就是它只是从Polygon#1中删除那个点(422,350)但是我得到了这个:
多边形#:0
点:(295,360)
点:(422,350)
点:(315,266)
点:(295,360)
多边形#:1
点:(295,360)
点:(315,266)
点:(295,360)
多边形#:2
点:(143,202)
点:(301,203)
点:(222,100)
点:(143,202)
它确实删除了(422,350),但它也有一个奇怪的副作用,即在删除其点之前将Polygon#0覆盖到Polygon#1.
我知道我的方法中使用的指针或引用不正确.有人可以指出我可能会做的是什么造成这种情况?我认为这是因为我的&nearestPolygon被声明为引用,但如果我尝试将其设置为其他任何内容,则会出现编译错误.
不幸的是,你不能重新引用一个引用,即这一行:
nearestPolygon =*listIter;
将复制*listIter
到closestPolygon
,而不是重新引用*listIter
.
编辑:要执行您想要的操作,您应该使用PolygonList::iterator
而不是相应地Polygon &
调整代码.