2012-04-20 16 views
2

マイナス( - )、インクリメント(++)などを使用して単項演算子のオーバーロードについて読んでいました。私は練習用に同じコードを書こうと思ったんだけど、実行しようとするとマイナスとインクリメント演算子の両方にエラーが出る。問題は私がmain.Canの演算子を呼び出す方法だと思うこれを行う正しい方法は何ですか?C++での単項演算子のオーバーロードが難しいですか?

#include<iostream> 

using namespace std; 

class c{ 
    int x; 
    int y; 
    public: 
     c(int a,int b){ 
      x=a; 
      y=b; 
     } 

     void operator -(){ 
      x=x+1; 
      y=y+1; 
     } 

     void display(){ 
      cout<<x<<" "<<y<<"\n"; 
     } 

}; 

int main() 
{ 
    c obj(2,3); 
    obj.display(); 
     obj- ; //I think the error is on this line 
    obj.display(); 
    return 0; 
} 

obj-を-objに置き換えた場合、コードは正常に動作します。なぜそうですか? + +演算子のオーバーロードで問題があります(++ objはうまく動作しますがobj ++は動作しません)、なぜですか?

ありがとうございました。

+0

オーバーロードされた演算子は値を返す必要があります。 @stashoverflow.com/questions/4421706/operator-overloadingを参照してください。 –

+0

@ThomasMatthews - 過負荷の演算子に値を返すことを要求する言語ではなく、* convention *です。オーバーロードされた演算子が 'void'を返すことは完全に可能であり、許容されます。そうすることは合法であり、オペレータの特定の用途を排除する。 –

答えて

4

単項マイナス演算子-は、接頭演算子のみです。

++オペレータのサフィックスバージョンをオーバーロードするには、ダミーintパラメータが必要です。例えば

struct foo 
{ 
    void operator -() 
    { 
     std::cout << "hello" << std::endl; 
    } 

    void operator ++ (int) 
    { 
     std::cout << "world" << std::endl; 
    } 
}; 

int main() 
{ 
    foo bar; 
    -bar; 
    bar++; 
} 
+0

助けてくれてありがとう。 –

+3

オーバーロードされたインクリメント演算子は値を返します。 * Scott Meyersによる* More Effective C++ *、** Item 6を参照してください。インクリメントとデクリメントの接頭辞と接頭辞の形式を区別する "**関連項目:http://stackoverflow.com/questions/4421706/operator-overloading –

+0

@ThomasMatthews良い点、私はそれがオペレータのセマンティクスを保持することが重要だと同意する –

1

単項演算子は否定演算子です。 -5または-varと言うときはどうなりますか。 5-またはvar-とは言っていません。 var - 3の後にいる場合は、バイナリ演算子をオーバーロードします。

ポストインクリメント演算子には、プリインクリメント演算子と区別するためのダミーint引数があります。

2

まず、新しい演算子を作成することはできません。既存の演算子を再定義するだけで、単項式のポストマイナスを行うことはできません。後減少演算子は(もちろん)1つではなく2つのマイナス記号です。

第2に、インクリメントまたはデクリメント演算子を定義するときに、関数を(未使用の)int引数に指定して、プリフォームとポストフォームを区別します。ファンクションに引数がある場合は、ポストインクリメントまたはポストデクリメント操作ですが、それがなければプリインクリメント/プリデクリメントです。

関連する問題