2017-10-18 80 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!現在我明白了...... –