Я не могу присвоить значение объекту в списке c

#c #object #setter

#c #объект #установщик

Вопрос:

У меня есть точка структуры, она содержит установщики для x и y:

 struct Point {
    int x;
    int y;

    Point() {
        x = 0;
        y = 0;
    }

    Point(int _x, int _y) {
        x = _x;
        y = _y;
    }

    Pointamp; 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;
    }

};
 

А также я создал структуру списка, Point get(int i) возвращает точку, которую я хочу изменить:

 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 amp;amp; i<0) return Point();
        Element *t = first;
        while(i--) t = t->right;
        return t->data;
    }

};
 

Затем в main я создаю список, добавляю точку в этот список, а затем пытаюсь изменить значения 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 не меняются и как это исправить?

Комментарии:

1. Почему происходит = обмен?

2. «Я пытаюсь изменить значения x и y, но они не меняются:» что вы имеете в виду? Ваш код не имеет выходных данных. Откуда вы знаете, что значения не изменились?

3. Я печатаю проверку x и y с помощью этой строки: cout << snake.get(0).x << » » << snake.get(0).y << endl;

4. Вам нужно вернуть Point ссылку по ссылке get . Что-то вроде Pointamp; get(int i) { ... }

5. Примечание: ваш Point пример квазикласса является почти хрестоматийным. idinews.com/quasiClass.pdf

Ответ №1:

Этот метод:

 Point get(int i) {
    if (i >= length amp;amp; i<0) return Point();
    Element *t = first;
    while(i--) t = t->right;
    return t->data;
}
 

возвращает Point значение by . Возвращаемый объект не является объектом в списке. Следовательно, здесь:

 snake.get(0).setX(99);
 

Вы делаете setX(99) из a Point , но это Point временный объект, возвращаемый из get . Вы, вероятно, хотите вместо этого вернуть ссылку. Однако тогда вам нужно найти другое решение if (i >= length amp;amp; i<0) return Point(); , то есть случай, когда индекс выходит за пределы, потому что вы не можете вернуть ссылку на локальную переменную. Вы можете либо создать исключение, либо просто предположить, что переданный индекс является допустимым. Измените его на:

 Pointamp; get(int i) {
   //^  return reference
    //if (i >= length amp;amp; i<0) return Point();
  //^^ DO NOT return a reference to  ^^ local object !!!
    Element *t = first;
    while(i--) t = t->right;
    return t->data;
}
 

Комментарии:

1. Спасибо! Теперь это работает. Я просто изменил подпись Point get (int i) на Point amp; get (int i)

2. @help нет. Это нехорошо. Как я уже писал, вы не должны возвращать ссылку на локальный объект. По крайней мере, вам нужно удалить строку: if (i >= length amp;amp; i<0) return Point(); . Или найдите другой способ обработки недопустимых индексов

3. Хорошо, я удалил эту строку. Я обработаю недопустимые индексы перед вызовом get then .

4. OP operator= использует идиому copy amp; swap. В данном случае это совершенно не нужно, но сама форма не является чем-то необычным.

5. @HolyBlackCat Я должен признать, я просто взял это из комментария, не задумываясь об этом, я удалю PS