我无法为列表 C++ 中的对象赋值
I can't assign value to object in list c++
我有结构点,它包含 x 和 y 的设置器:
struct Point {
int x;
int y;
Point() {
x = 0;
y = 0;
}
Point(int _x, int _y) {
x = _x;
y = _y;
}
Point& operator=(Point other) {
swap(x, other.x);
swap(y, other.y);
return *this;
}
void setX(int _) { x = _; }
void setY(int _) { y = _; }
};
我还有双向列表的元素,它的数据是点:
struct Element {
Point data;
Element *left;
Element *right;
Element(Point data) {
this->data = data;
left = right = this;
}
};
我还创建了 List 结构,Point get(int i) returns 我要更改的点:
struct List {
Element *first;
Element *last;
int length;
List() {
first = last = nullptr;
length = 0;
}
Point add(Point data) {
Element *e = new Element(data);
length++;
if (!last) {
first = last = e;
return data;
}
e->left = last;
last = last->right = e;
return data;
}
Point get(int i) {
if (i >= length && i<0) return Point();
Element *t = first;
while(i--) t = t->right;
return t->data;
}
};
然后在 main 中创建 List,将 Point 添加到该列表,然后尝试更改 x 和 y 值,但它们没有改变:
int main() {
....
List snake;
snake.add(Point(3,4));
cout << snake.get(0).x << " " << snake.get(0).y << endl;
snake.get(0).setX(99);
snake.get(0).setY(99);
cout << snake.get(0).x << " " << snake.get(0).y << endl;
.....
}
请帮忙!为什么 x 和 y 值不改变,如何解决?
这个方法:
Point get(int i) {
if (i >= length && i<0) return Point();
Element *t = first;
while(i--) t = t->right;
return t->data;
}
return按值 Point
。对象 returned 不是列表中的对象。因此这里:
snake.get(0).setX(99);
您对 Point
进行了 setX(99)
,但是 Point
是 return 从 get
编辑的临时对象。您可能想要 return 一个参考。但是,您需要为 if (i >= length && i<0) return Point();
找到不同的解决方案,即索引越界时的情况,因为您不能 return 对局部变量的引用。您可以抛出异常或简单地假设传递的索引是有效的。将其更改为:
Point& get(int i) {
//^ return reference
//if (i >= length && i<0) return Point();
//^^ DO NOT return a reference to ^^ local object !!!
Element *t = first;
while(i--) t = t->right;
return t->data;
}
我有结构点,它包含 x 和 y 的设置器:
struct Point {
int x;
int y;
Point() {
x = 0;
y = 0;
}
Point(int _x, int _y) {
x = _x;
y = _y;
}
Point& operator=(Point other) {
swap(x, other.x);
swap(y, other.y);
return *this;
}
void setX(int _) { x = _; }
void setY(int _) { y = _; }
};
我还有双向列表的元素,它的数据是点:
struct Element {
Point data;
Element *left;
Element *right;
Element(Point data) {
this->data = data;
left = right = this;
}
};
我还创建了 List 结构,Point get(int i) returns 我要更改的点:
struct List {
Element *first;
Element *last;
int length;
List() {
first = last = nullptr;
length = 0;
}
Point add(Point data) {
Element *e = new Element(data);
length++;
if (!last) {
first = last = e;
return data;
}
e->left = last;
last = last->right = e;
return data;
}
Point get(int i) {
if (i >= length && i<0) return Point();
Element *t = first;
while(i--) t = t->right;
return t->data;
}
};
然后在 main 中创建 List,将 Point 添加到该列表,然后尝试更改 x 和 y 值,但它们没有改变:
int main() {
....
List snake;
snake.add(Point(3,4));
cout << snake.get(0).x << " " << snake.get(0).y << endl;
snake.get(0).setX(99);
snake.get(0).setY(99);
cout << snake.get(0).x << " " << snake.get(0).y << endl;
.....
}
请帮忙!为什么 x 和 y 值不改变,如何解决?
这个方法:
Point get(int i) {
if (i >= length && i<0) return Point();
Element *t = first;
while(i--) t = t->right;
return t->data;
}
return按值 Point
。对象 returned 不是列表中的对象。因此这里:
snake.get(0).setX(99);
您对 Point
进行了 setX(99)
,但是 Point
是 return 从 get
编辑的临时对象。您可能想要 return 一个参考。但是,您需要为 if (i >= length && i<0) return Point();
找到不同的解决方案,即索引越界时的情况,因为您不能 return 对局部变量的引用。您可以抛出异常或简单地假设传递的索引是有效的。将其更改为:
Point& get(int i) {
//^ return reference
//if (i >= length && i<0) return Point();
//^^ DO NOT return a reference to ^^ local object !!!
Element *t = first;
while(i--) t = t->right;
return t->data;
}