Поменять местами значения двух атрибутов двух объектов - PullRequest
2 голосов
/ 12 апреля 2020

Я изучаю C ++ (из Python) и пытаюсь понять, как объекты взаимодействуют друг с другом. Я хотел создать класс 'Point', который имеет два атрибута (координаты x и y) и дать ему метод, который может менять координаты двух точек (см. Мой код ниже). С данным кодом координаты точки p1 изменяются на координаты p2, но координаты p2 остаются неизменными. Кто-нибудь может мне помочь и объяснить, как мне этого добиться?

Заранее спасибо!

#include<iostream>
using namespace std;

//Class definition.
class Point {
public:
    double x,y; 

    void set_coordinates(double x, double y){
    this -> x = x; 
    this -> y = y;
    }

    void swap_coordinates(Point point){
        double temp_x, temp_y;

        temp_x = this -> x;
        temp_y = this -> y;

        this -> x = point.x;
        this -> y = point.y;

        point.x = temp_x;
        point.y = temp_y;
    }
};

//main function.

int main(){

Point p1,p2;

p1.set_coordinates(1,2);
p2.set_coordinates(3,4);

cout << "Before swapping the coordinates of point 1 are (" << p1.x << ","<< p1.y<<")\n";
cout << "and the coordinates of point 2 are ("<< p2.x << ","<< p2.y << ").\n";

p1.swap_coordinates(p2);

cout << "After swapping the coordinates of point 1 are (" << p1.x << ","<< p1.y<<")\n";
cout << "and the coordinates of point 2 are ("<< p2.x << ","<< p2.y << ").\n";

return 0;
}

Ответы [ 2 ]

3 голосов
/ 12 апреля 2020

Параметр point из swap_coordinates объявлен как передаваемый по значению, это просто копия аргумента, и любая его модификация не имеет ничего общего с исходным аргументом.

Измените его перейти по ссылке.

void swap_coordinates(Point& point) {
//                         ^
    ...
}
1 голос
/ 12 апреля 2020

Обратитесь к понятиям «передать по ссылке» и «По значению», которые устранят вашу проблему:

void swap_coordinates(Point& point){
        double temp_x, temp_y;

        temp_x = this -> x;
        temp_y = this -> y;

        this -> x = point.x;
        this -> y = point.y;

        point.x = temp_x;
        point.y = temp_y;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...