创建Rectangle对象很简单,但是一旦我尝试使用Point类中的成员函数移动这些点,Rectangle对象的X和Y值就不会更新,但函数内的值会更新。
这是Rectangle类的头文件:
class Rectangle {
public:
Rectangle () : ur(), ll() {
}
~Rectangle () {
}
Rectangle (const Rectangle *);
Rectangle (const Point&, const Point&);
Rectangle & operator=(const Rectangle &);
Rectangle compareArea(const Rectangle *) const;
Rectangle compareVolume(const Rectangle *) const;
Point getUR(void) const;
Point getLL(void) const;
void print(const Rectangle *) const;
protected:
Point ur;
Point ll;
};
和我的Point类:
class Point {
public:
Point() : x(), y() {
}// Default const
~Point() {
}// Destructor
Point(const Point&); // Copy const
Point(const Fraction&, const Fraction&);
Point& operator=(const Point&); // Assignment
void moveBy(const Fraction&, const Fraction&);
void moveBy(int);
void flipByX(void);
void flipByY(void);
void flipThroughOrigin(void);
void print(void);
Fraction getX(void) const;
Fraction getY(void) const;
protected:
Fraction x; // x-coordinate of the point
Fraction y; // y-coordinate of the point
};
以下是Point类的“move”成员函数之一如下:
void Point::moveBy(const Fraction& dx, const Fraction& dy) {
x += dx; // Overloaded all comparison/ arithmetic operators in basic Fraction class
y += dy;
}
我需要通过声明一个设置为null的Rectangle指针来创建Rectangle对象,直到用户决定创建两个Rectangle对象。
一切正常,用户输入的值正确存储。
但是,当我尝试使用Point中的成员函数移动Rectangle类中的右上角(Point ur)和左下角(Point ll)时,Point ur和Point ll的Fraction x和Fraction y的值没有更新。
这是因为我的“get”方法是const吗?
以下是我称之为“移动”的方法:
Rectangle* r1 = new Rectangle(xC, yC); // Assume xC and yC are proper fraction coordinates for X and Y
// Move now after user chooses some options in a menu
r1->getUR().getX().moveBy(Fraction(xNew, yNew), Fraction(xNew, yNew)); // Assume xNew, yNew are valid Fractions that the user has chosen to move his Points by...
不反映(不更新或存储)值。当我打印坐标点时,我得到原始的xC和yC值。我究竟做错了什么? (我需要以这种方式创建我的代码。不能使用智能指针,向量等。)如果你想查看我的其余代码以确定它是错误的,我会尽快发布。
答案 0 :(得分:2)
问题在于你的吸气剂 - 但它与const
没有关系。 (const
,实际上,意味着对象没有被修改。从技术上讲,这意味着可以在const
对象上调用成员函数,this
的类型是{{1} }而不是const Class*
。)
问题是他们返回对象:
Class*
即全新的物品。 复制的实际成员。您想要返回引用:
Fraction getX(void) const;
如果您需要const版本:
Fraction& getX();
答案 1 :(得分:0)
由于它按值而不是通过引用或指针返回对象,getUR()
会返回其中Point
的副本。对副本的更改不会影响原件。
如果您希望能够以这种方式修改矩形的角落,则需要让它返回引用或指针。
更安全的方法是让Rectangle类本身进行必要的更改。这样你就可以控制类的内部细节,而且如果在对象死后使用它们,那么这个类的用户不必关心可能打开虫洞的指针/引用。
答案 2 :(得分:0)
可能会有更多问题:
一个。我不确定你是不是应该这样称呼它
r1->getUR().moveBy(Fraction(xNew, yNew), Fraction(xNew, yNew));
湾真正的问题是你是按值返回而不是通过Rectangle :: getUR()引用,所以你在完全不同的对象上调用moveBy()。如果这不是一些愚蠢的错误并且你没有立即得到它我建议阅读一些关于C ++引用的内容。