我是C ++新手,现在在单一链接列表上练习。不知何故,下面代码的输出始终为零。我认为问题是nextPoint方法但是我尝试更改引用/取消引用,它不起作用。
问题出在哪里?提前谢谢。
// Singly Linked List
#include <math.h>
#include <iostream>
class Point {
public:
double x, y;
Point* next;
// constructor
Point (double x, double y) {
this->x = x;
this->y = y;
this->next = NULL;
}
void nextPoint(Point nexti) {
this->next = &nexti;
}
double dist(Point &a, Point &b) {
double dx = a.x - b.x;
double dy = a.y - b.y;
return sqrt(dx*dx - dy*dy);
}
double length() {
Point *iter = this;
double len = 0.0;
while (iter->next != NULL) {
len += dist(*iter, *iter->next);
iter = iter->next;
}
return len;
}
};
int main() {
Point p1(1,1);
Point p2(2,2);
Point p3(5,5);
p1.nextPoint(p2);
p2.nextPoint(p3);
std::cout << p1.length() << std::endl;
return 1;
}
答案 0 :(得分:3)
请打开更多编译器警告,您可能会在nextPoint
中发出警告,表示您正在永久存储临时变量(nexti
)的地址(this->next
中)。
您必须传递要添加的点的地址或引用。
void nextPoint(Point *nexti) {
this->next = nexti;
}
p1.nextPoint(&p2);
p2.nextPoint(&p3);
或
void nextPoint(Point &nexti) {
this->next = &nexti;
}
p1.nextPoint(p2);
p2.nextPoint(p3);
附注:请将NULL
替换为nullptr
。
答案 1 :(得分:3)
您的代码存在两个问题:
nextPoint
按值获取其参数,这意味着您将存储该按值参数的地址,该参数在nextPoint
的执行结束后立即变为无效。将其更改为接受Point &nexti
。
您的距离计算功能错误。您应该添加方块,而不是减去它们:return sqrt(dx*dx + dy*dy);
与您的问题无关,但有几种方法可以改进您的代码:
使用构造函数中的mem-initialiser列表初始化成员,而不是为其分配。这是一个很好的习惯,因为一旦你开始处理初始化和赋值大不相同的事情(引用,类,......),这将是有用的。
Point (double x, double y) : x(x), y(y), next(nullptr)
{}
使用nullptr
代替NULL
,因为后者不是类型安全的。
length
应标记为const
,因为它不会修改其所调用的对象。请注意,iter
同样已更改为const Point *
:
double length() const {
const Point *iter = this;
double len = 0.0;
while (iter->next != NULL) {
len += dist(*iter, *iter->next);
iter = iter->next;
}
return len;
}
dist
根本不使用this
,因此它可以(并且应该)成为static
成员函数。此外,它应该使用const &
的参数,因为它不会修改它们:
static double dist(const Point &a, const Point &b) {
double dx = a.x - b.x;
double dy = a.y - b.y;
return sqrt(dx*dx - dy*dy);
}