2009-07-07 12 views
3

はのは、私はクラスPointを持っているとしましょう:まだ持ちながら、C++の演算子と引数

Point p1; 
p1 += Point(10,10); 

そして、これを行うにはどのような方法があります:

class Point { 
    int x, y; 
public: 
    Point& operator+=(const Point &p) { x=p.x; y=p.y; return *this; } 
}; 

はなぜ、このようなとしてこれを呼び出すことはできません引数としての参照?

答えて

8

は、ここでは、必要なコードです:

class Point { 
    int x,y; 
public: 
    Point(int x=0,int y=0) : x(x), y(y) {} 
    Point& operator+=(const Point&p) {x+=p.x;y+=p.y;return *this;} 
}; 

コンラートが指摘したように、あなたは、コンストラクタを必要としています。また、演算子のオーバーロードの中で明示的に加算を実行する必要があります。

+0

上記のコードをカットアンドペーストする場合は、コンストラクタ宣言の後にセミコロンを追加することを忘れないでください。 – Meir

+2

私はそれが間違っていると思う... –

11

なぜ私は、このようなとしてこれを呼び出すことはできません:あなたは、一致するコンストラクタを宣言するのを忘れたので

。それ以外は、この呼び出しは正常に見えます。

(また、operator +=のコードは間違っています:追加する代わりに値を上書きします)。

+1

彼は現在の値を使用したくないので追加していないかもしれません。それは未定義です:) –

+3

デフォルトのコンストラクタも必要であることに注意してください。 – markh44

+0

@ markh44:コンパイラは、デフォルトのコンストラクタを提供します(有用ではありません)。 @Danielは+ =演算で加算を行わないのは技術的に実現可能かもしれないが、それは論理的な誤りである。 –

4

オペレータコードは完全に問題ありません。あなたは、このようなデフォルトコンストラクタを自分で宣言する必要がありPoint x;としてインスタンス化を行うために、その後いくつかの引数を取るコンストラクタを宣言した場合という

class Point { 
public: 
    Point() : x(0), y(0) { } 
    Point(int _x, int _y) : x(_x), y(_y) { } 
// rest of the code 
}; 

注:あなたは、2つのintを取るコンストラクタを作成する必要があります。

P.S.ただKonradの答えを読んでください。はい、=ではなく、+=をメンバーに使用することができます。 :)