プロが教えるわが家の防犯対策術!

インクリメント演算子をオーバーロードして、後置きインクリメントの場合に戻り値が演算前の結果を返すようにする方法はありませんか?

class Sample
{
 public int x;
 public int y;
 public Sample(int x, int y)
 {
  this.x = x;
  this.y = y;
 }
 public override string ToString()
 {
  return base.ToString() + " - x = " + x + ", y = " + y;
 }
 public static Sample operator ++()
 {
  x++; y++;
  return this;
 }
}

class EntryPoint
{
 public static void Main()
 {
  Sample sample = new Sample(1, 2);
  // 「Sample - x = 2, y = 3」で、期待通り
  Console.WriteLine(++sample);
  // 「Sample - x = 3, y = 4」で、期待したのはインクリメントされる前の値である「「Sample - x = 2, y = 3」
  Console.WriteLine(sample++);
 }
}

A 回答 (1件)

参考サイトによるとこんな感じで出来る様です。



public static Sample operator ++( Sample smpl )
{
Sample tmp = new Sample( smpl.x + 1, smpl.y + 1 );
return tmp;
}

参考URL:http://ufcpp.net/study/csharp/oo_operator.html#o …
    • good
    • 0
この回答へのお礼

ありがとうございます。
新しいインスタンスを作成して、それをreturnすれば、呼び出し元の変数に、暗黙のうちにreturnされたインスタンスが代入されるみたいですね。
yamada404さんのメソッドに書き換えたとすると、

Sample sample = new Sample(1, 2);
Sample s_const = sample;
sample++; // sample変数には、new Sample(2, 3)のインスタンスが代入される
// s_constには、最初に作成されたインスタンスのまま


インスタンス自体に対して演算しているわけではないことを頭に入れておかないと、とんでもないミスプログラムを書いてしまいそうです。

ちなみに、最初に質問した時のプログラムは、operator ++メソッドが引数がなくて、コンパイルできませんでした。ごめんなさい。

お礼日時:2009/08/20 13:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!