2012-07-05 43 views
1

我有一個類:奇怪的行爲

class Point3D : public Point{ 
    protected: 
     float x; 
     float y; 
     float z; 

    public: 
     Point3D(){x=0; y=0; z=0;} 
     Point3D(const Point3D & point){x = point.x; y = point.y; z = point.z;} 
     Point3D(float _x,float _y,float _z){x = _x; y = _y; z = _z;} 

     inline const Point3D operator+(const Vector3D &); 

     const Point3D & operator+(const Point3D &point){ 
      float xT = x + point.getX(); 
      float yT = y + point.getY(); 
      float zT = z + point.getZ(); 
      return Point3D(xT, yT, zT); 
     } 
... 

當我使用這種方式:

Point3D point = Point3D(10,0,10); 

一切正常。

當我寫:

Point3D point = Point3D(10,0,10); 
Point3D point2 = Point3D(0,0,0) + point(); 

而且它的確定(點2 =點)。當我添加超過(0,0,0)的東西時,它也在工作。

但是,當我想剛:

Point3D point = Point3D(10,0,10); 
someFunction(Point3D(0,0,0) + point); //will get strange (x,y,z) 

的一些函數來獲取值(在我看來)隨機的(X,Y,Z)。爲什麼?

什麼是更奇怪的,因爲類似的例子一切將再次合作

Point3D point = Point3D(10,0,10); 
Point3D point2 = Point3D(0,0,0) + point; 
someFunction(point2); // will get (10,0,10) 

什麼是該異常行爲的原因是什麼?

+0

在這篇文章請看:http://stackoverflow.com/questions/4421706/operator-overloading –

回答

4

operator+()正在返回一個懸掛引用,返回的引用指的是Point3D實例,當operator+()返回時會被銷燬。更改爲:

Point3D operator+(const Point3D &point) const { 

所以返回一個副本,並使其const因爲它沒有理由改變任何東西。

+0

運算符+應該也是一個const成員函數,IMO。 – Goz

+0

@Goz,正在編輯我的答案,表明這一點。 – hmjd

2

您正在返回一個來自operator+的局部變量的引用,一旦函數返回就會失效,您需要返回創建的Point3D副本。

+0

我已+1,直到你說它應該返回*這。現在我-1。它是運營商+,而不是運營商+ =。爲什麼它應該改變任何參數? –

+0

@Luchian Grigore:搞糊塗了:) ..現在改回去了。 – Asha

3

用於支持算術運算符類的典型模式是

class Foo 
{ 
public: 
    Foo & operator+=(Foo const & rhs) { /* ... */ return *this; } 
    Foo & operator-=(Foo const & rhs) { /* ... */ return *this; } 
    Foo & operator*=(Foo const & rhs) { /* ... */ return *this; } 
    Foo & operator/=(Foo const & rhs) { /* ... */ return *this; } 
}; 

Foo operator+(Foo const & lhs, Foo const & rhs) { return Foo(lhs) += rhs; } 
Foo operator-(Foo const & lhs, Foo const & rhs) { return Foo(lhs) -= rhs; } 
Foo operator*(Foo const & lhs, Foo const & rhs) { return Foo(lhs) *= rhs; } 
Foo operator/(Foo const & lhs, Foo const & rhs) { return Foo(lhs) /= rhs; } 
+0

+1運算符+應該是一個用+ = member實現的免費函數;儘管最好使它返回const Foo,所以不能像(A + B)= C那樣寫廢話; – stijn