1

我试图在用户输入后获取 x 和 y 的值,将值放在构造函数中,并使用getX()andgetY()方法Point.cpp进行一些计算,但问题是,它总是返回X:0 Y:0,我不知道为什么。我的代码如下

点.cpp

#include <iostream>
#include "Point.h"
using namespace std;

     Point::Point(int x,int y)  {
        setX(x);
        setY(y);
     } 

     int Point::getX() {
       return x;
     }

     int Point::getY() {
       return y;
     }

     void Point::setX(int x) {
       this->x = x;
     }

     void Point::setY(int y) {
      this->y = y;
    } 

    void Point::someMethods() {
       x = getX();
       y = getY();
       cout << "X:" << x << "Y:" << y;
       // do some methods here after getting the x and y cords;
    }

点.h

 #ifndef Point_Point_h
 #define Point_Point_h

class Point {
  private:
         int x,y;
  public : 

       Point() {
       x = 0;
       y = 0;
       }//default consrructor

      Point(int x,int y);
      int getX();
      int getY();
      void setX(int x);
      void setY(int y);
      void someMethods();
 };    

#endif
4

6 回答 6

3

在 main 函数中,您有语句

Point Point(x,y);

当我认为你的意思是

Point point(x,y);

事实上,point.someMethods()下面的调用使用了point在 main 函数之前声明的全局对象,我认为这是问题所在。

于 2013-10-11T06:25:13.377 回答
3

您正在调用全局点对象上的 someMethods(),该点对象是使用将 x 和 y 值初始化为 0 的默认构造函数创建的。

使用下面的代码。

#include <iostream> 
#include "Point.h"
using namespace std;
int main()
{     
    int x,y;
    cout << "Please Enter x-Cordinate"<< endl;
    cin >> x;
    cout << "Please Enter y-Cordinate" << endl;
    cin >> y;

    Point point(x,y);

    //just putting here in main to show that X and Y value isn't passed
    point.someMethods(); // This should print the proper X and Y values
}
于 2013-10-11T06:25:36.743 回答
2

您需要注意您确实这样做了point.someMethods(),但实际上从未更改point为使用 x 和 y。

int x,y;
int main()
{     
    cout << "Please Enter x-Cordinate"<< endl;
    cin >> x;
    cout << "Please Enter y-Cordinate" << endl;
    cin >> y;

    Point point(x,y);

    //just putting here in main to show that X and Y value isn't passed
    point.someMethods(); <-- the output will always be X:0 Y:0 no matter what value the user input
}

将起作用,因为现在该点是用 x 和 y 创建的(请注意,我已经从 main 函数之前删除了点声明。您也可以在那里声明它并使用它的 set 函数)。

于 2013-10-11T06:23:52.997 回答
2

发生这种情况是因为您的程序中有 2 个“Point”对象。一个在这里实例化:“Point point;” 另一个在这里实例化:“Point Point(x,y);”。

最后你调用“point.someMethods();” 使用第一个对象,该对象是使用默认构造函数构造的,因此将 x 和 y 设置为 0。

我相信在这种情况下你应该删除“Point point;” 从全局命名空间实例化,并更改“Point Point(x,y);”的名称 到“点点(x,y);”。然后它将按预期工作:

#include <iostream> 
#include "Point.h"
using namespace std;
int x,y;

int main()
{     
    cout << "Please Enter x-Cordinate"<< endl;
    cin >> x;
    cout << "Please Enter y-Cordinate" << endl;
    cin >> y;

    Point point(x,y);

    //just putting here in main to show that X and Y value isn't passed
    point.someMethods(); <-- the output will always be X:0 Y:0 no matter what value the user input
}
于 2013-10-11T06:24:49.627 回答
2

问题

您没有修改零初始化变量

Point point; // <---- only this variable is zero-initialized
int main()
{     
    // ...

    //just putting here in main to show that X and Y value isn't passed
    point.someMethods(); //<-- the output will always be X:0 Y:0 no matter what value the user input
//  ^^^^^ <--- again, still zero
}   

解决方案

相反,请执行以下操作:

int main()
{     
    Point point(1,2); // <-- or read from std::cin

    //just putting here in main to show that X and Y value isn't passed
    point.someMethods(); //<-- value the user input
} 

现场示例

笔记

仅仅因为这里有,编写构造函数的规范方法是

class Point
{
private:
   int x = 0; // any constructor which does explicitly set x or y
   int y = 0; // will take these in-class initializer values

public:
   // default constructor uses in-class initializer
   Point() = default; // sets to (0,0)

   // other constructor does NOT use setters but initialization list
   Point(int a, int b): x{a}, y{b} {} // sets to (a,b)
};
于 2013-10-11T06:24:55.580 回答
2

您需要更改 Point Point(x,y); 到 Point point(x,y) 并删除 Point point;

于 2013-10-11T06:25:46.757 回答