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();

また、大丈夫です(point2 = point)。(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)

その奇妙な行動の理由は何ですか?

4

3 に答える 3

4

operator+()ぶら下がっている参照を返しています。返された参照は、戻っPoint3Dたときに破棄されるインスタンスを参照していoperator+()ます。への変更:

Point3D operator+(const Point3D &point) const {

したがって、コピーが返され、const何も変更する理由がないので作成します。

于 2012-07-05T08:42:35.977 に答える
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; }
于 2012-07-05T08:53:37.670 に答える
2

関数が戻ると無効になるローカル変数への参照を返しています。作成されたoperator+もののコピーを返す必要がありますPoint3D

于 2012-07-05T08:42:05.953 に答える