Câu hỏi cuối cùng cho tối nay, tôi hứa. Những con trỏ này khiến tôi đau đầu nghiêm trọng.Làm thế nào tôi vô tình ghi đè khi tham chiếu các con trỏ này?
Tôi có một std :: danh sách <Point
> gọi Polygon và một std :: danh sách các đa giác được xác định như sau:
typedef std::list<Point> Polygon;
typedef std::list<Polygon> PolygonList;
// List of all our polygons
PolygonList polygonList;
Tôi tạo ra phương pháp dưới đây để cố gắng để xóa các điểm gần nhất từ một (x, y), kiểm tra tất cả các Đa giác của tôi trong polygonList của tôi.
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();
}
Tuy nhiên, ở đâu đó tôi có con trỏ hoặc biến tham chiếu làm tôi say mê. Mã này biên dịch nhưng hành động theo một cách rất lạ.
Tôi đã viết một tuyên bố gỡ lỗi và cho phép nói rằng tôi có 3 đa giác trong danh sách đa giác của tôi như vậy:
Polygon #: 0
Point: (448, 43)
Point: (469 , 177)
Point: (374, 123)
Polygon #: 1
Point: (295, 360)
Point: (422, 350)
Point: (315, 266)
Point: (295, 360)
Polygon #: 2
Point: (143, 202)
Point: (301, 203)
Point: (222, 100)
Point: (143, 202)
Bây giờ, giả sử tôi thử và sử dụng chức năng xóa cho điểm x/y gần 422, 350 Kết quả mong muốn sẽ đơn giản là xóa điểm đó (422, 350) khỏi Đa giáC# 1 nhưng thay vào đó Tôi nhận được điều này:
Đa giáC#: 0
Point: (295, 360)
Point: (422, 350)
Point: (315, 266)
Point: (295, 360)
Polygon #: 1
Point: (295, 360)
Point: (315, 266)
Point: (295, 360)
Polygon #: 2
Point: (143, 202)
Point: (301, 203)
Point: (222, 100)
Điểm: (1 43, 202)
Nó đã xóa (422, 350) nhưng nó cũng có tác dụng phụ lạ khi ghi đè Polygon # 0 vào Polygon # 1 trước khi xóa điểm của nó.
Tôi biết tôi đang sử dụng con trỏ hoặc tham chiếu không chính xác trong phương pháp của mình. Ai đó có thể chỉ ra những gì tôi có thể có thể làm được là gây ra điều này? Tôi nghĩ rằng đó là vì & closestPolygon của tôi được khai báo là một tham chiếu, nhưng tôi nhận được các lỗi biên dịch nếu tôi cố gắng đặt nó thành bất kỳ thứ gì khác.
Là một sang một bên, và hy vọng với một số giá trị giáo dục: làm việc với khoảng cách bình phương sẽ giúp bạn tiết kiệm chi phí sqrt() cuộc gọi. Ngoài ra, pow() khá đắt tiền; vì bạn chỉ sử dụng các số nguyên, bạn nên viết hàm square() của chính mình. – Thomas