我无法为列表 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;
}