2017-10-18 83 views
0

我的工作类现在链接同一对象的方法

但有调用方法(这里的链的问题是代码

class Point{ 
public: 
    int x; 
    int y; 
    Point(int i , int j); 
    Point incrementX(); 
    Point incrementY(); 
    void print(); 
}; 
Point::Point(int i, int j){ 
    x = i; 
    y = j; 
} 
Point Point::incrementX(){ 
    x++; 
    return(*this); 
} 
Point Point::incrementY(){ 
    y++; 
    return(*this); 
} 
void Point::print(){ 
    cout << "(" << x << "," << y << ")" << endl; 
} 

void Q11(){ 
    Point a(2,3); 
    //(3,4) 
    a.incrementX().incrementY().print(); 
    //(3,3)why 33 here ?? 
    a.print(); 
} 

我很困惑,为什么最后一个代码a.print()给人的(3,3)

,我尝试打印出来的方法

我里面的this地址发现两个地址时,主叫incrementX()incrementY()是不同

我的猜测是,incrementX()访问类,但调用incrementY()上课的时候被占用。因此,它使堆中类的副本,然后incrementY()更改Y在副本...

所以(3,4)被复制印刷,并(3,3)是由实际的类印刷...

回答

2

incrementXincrementY函数返回按值。这是说,在从这些函数返回的对象被复制等后续操作上不同的实例发生。

你可以看到发生在编译错误被你删除的拷贝构造函数。要做到这一点添加

Point(const Point&) = delete; 

(假定C++ 11或更高的使用delete如果旧的只是让私人)

所以诊断您的实际错误:

  1. 你构建Point与值(2,3)
  2. incrementX的第一个电话会使用您的原始实例(现在的值为(3,3)),并在返回时传出一份副本。
  3. incrementY对临时副本进行操作并将其值更新为(3,4)。它也会返回一个副本。
  4. 您打印具有预期结果的第二个临时副本(3,4)。
  5. 现在a.print()显示您尚未因为调用感动incrementX和显示器(3,3)原Point

为了利用链接的你想使用,你的所有操作都应该出现相同对象上实现,你应该从这些功能通过非const 参考返回。

函数签名

Point Point::incrementX() 

成为

Point& Point::incrementX() 

和完整的代码如下所示。

#include <iostream> 
using namespace std; 

class Point{ 
public: 
    int x; 
    int y; 
    Point(int i , int j); 
    //Point(const Point&) = delete; 
    Point& incrementX(); 
    Point& incrementY(); 
    void print(); 
}; 
Point::Point(int i, int j){ 
    x = i; 
    y = j; 
} 
Point& Point::incrementX(){ 
    x++; 
    return(*this); 
} 
Point& Point::incrementY(){ 
    y++; 
    return(*this); 
} 
void Point::print(){ 
    cout << "(" << x << "," << y << ")" << endl; 
} 

int main(){ 
    Point a(2,3); 
    a.incrementX().incrementY().print(); 
    a.print(); 
} 

与删除的拷贝构造函数的代码编译罚款,因为没有副本发生。

+0

是的......我知道了...... thx! –

3

只有a.incrementX()递增成员值。 a.incrementX().incrementY()增加一个临时实例并被丢弃。

替换点与Point&Point Point::incrementX()功能,你会得到正确的结果。

+0

thx!现在我明白了...... –