#include <iostream>
#include <string>

using namespace std;

struct Point {
private:
    int xCord,yCord;

public:
    void setX(int x);
    void setY(int y);
    int getX();
    int getY();
    int rotate(int x, int y, Point p1);
    int moveHorizontally(int x, int a, int b);
    int moveVertically(int y, int a, int b);    
};

int main() {
    Point p1;

    p1.setX(1);     //sets X
    p1.setY(2);     //sets Y

    cout << p1.getX() << ", " << p1.getY() << endl;  //prints current value of X & Y 

    p1.rotate(p1.getX(), p1.getY(), p1);
    cout << p1.getX() << ", " << p1.getY() << endl; 

    return 0;
}

void Point::setX(int newX) {
    xCord = newX;
}

void Point::setY(int newY) {
    yCord = newY;
}

int Point::getY() {       //This will just return the y Cord.
    return yCord;
}

int Point::getX() {      //This will just return the x Cord.
    return xCord;
}

int Point::moveHorizontally(int x, int tempX, int tempY) {
    //Move the point to the right if positive.
    //Move the point to the left if negative.
    int newX = tempX + (x);
    return newX;
}

int Point::moveVertically(int y, int tempX, int tempY) {
    //Move the point up if positive.
    //Move the point down if negative.
    int newY = tempY + (y);
    return newY;
}

int Point::rotate(int tempX, int tempY, Point p1){  
    //(1,2) -->> (-2,1)
    int tempX_DNC = tempX;
    int tempY_DNC = tempY;
    int quadrant;

    if((tempX > 0) && (tempY > 0)) {     //Quadrant 1: x(positive), y(positive)  Then rotates to Quad 2
        quadrant = 1;
        tempX = -(tempY);
        tempY = tempX_DNC;
    } else if ((tempX < 0) && (tempY > 0)) {      //Quadrant 2: x(negative), y(positive)  Then rotates to Quad 3
        quadrant = 2;
        tempX = -(tempY_DNC);
        tempY = tempX_DNC;
    } else if ((tempX < 0) && (tempY < 0)) {     //Quadrant 3: x(negative), y(negative)   Then rotates to Quad 4
        quadrant = 3;
        tempX = -(tempY_DNC);
        tempY = tempX_DNC;
    } else if ((tempX > 0) && (tempY < 0)) {     //Quadrant 4: x(positive), y(negative)  Then rotates to Quad 1
        quadrant = 4;
        tempX = -(tempY_DNC);
        tempY = tempX_DNC; 
    } else {
        quadrant = 0;
    }

    //This will rotate the points 90* to the left.
    //(1,2) will then become (-2,1)
    //I could have if in quadrant1, all are positive, if in quadrant 2 the x would be negative and y would be positive
    //If in quadrant 3 the x and y will both be negative, if in quadrant 4 the x would be positive and the y would be negative
    cout << tempX << ", " << tempY << endl;
    p1.setX(tempX);
    p1.setY(tempY);
    cout <<"x is: " <<p1.getX() <<endl;
    cout <<"Y is: " <<p1.getY() <<endl;
}

Код выше.

Итак, я создаю класс Point. Point имеет 2 закрытые переменные xCord, yCord. Я хочу вызвать функцию поворота и иметь возможность изменять xCord, yCord, но это не так. Я не знаю почему. Я попытался передать Point p1 функции и посмотреть, решит ли это проблему, но этого не произошло. Я также попытался не передавать Point p1 и просто имел Point p1 внутри определения функции.

P1.setX (ПЕРЕМЕННАЯ); работает, когда он находится в main (). но не тогда, когда я вызываю p1.setX (VARIABLE) внутри другой функции-члена.

1
Juscallmesteve 6 Окт 2016 в 17:05

3 ответа

Лучший ответ

Вы передаете точку по значению:

int rotate(int x, int y, Point p1);
                               ^^--------pass-by-value

Т.е. p1 внутри функции является копией p1 в main, которая удаляется после возврата из функции. Если вы хотите изменить точку, переданную как параметр внутри функции, передайте ее по ссылке:

int rotate(int x, int y, Point& p1);
                            ^^--------pass-by-reference

PS: ... Однако, поскольку rotate является функцией-членом Point, вам, вероятно, следует повернуть экземпляр, для которого вы его вызываете, изменить его подпись на

int rotate(int x, int y);

И вместо изменения координат некоторой точки, переданной в качестве параметра, сделайте следующее:

 this->setX(tempX);  // this-> not really necessary, just added for clarity
 this->setY(tempY);

В качестве альтернативы вы можете оставить его как есть и передать точку, которая должна быть повернута в качестве параметра, но тогда вам следует подумать о создании метода static.

PPS : если вы хотите изменить его на передачу по ссылке, вам необходимо изменить подпись в объявлении класса на:

int rotate(int x, int y, Point& p1);

И определение, которое вы должны изменить на:

int Point::rotate(int tempX, int tempY, Point& p1) { /*...*/ }
1
largest_prime_is_463035818 6 Окт 2016 в 14:30
void point::rotate() {
xcord = ycord;
ycord = xcord;
}

Это все, что вам нужно для базовой ротации

-2
Piet Jan 6 Окт 2016 в 14:31

Вы передаете копию p1 функции rotate. Изменена только эта копия.

2
robert 6 Окт 2016 в 15:56