みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C#のインクリメント演算子のオーバーロード(前置きと後置き)

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

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++);
 }
}

投稿日時 - 2009-08-20 10:15:32

QNo.5221813

暇なときに回答ください

質問者が選んだベストアンサー

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

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#overload

投稿日時 - 2009-08-20 11:03:40

お礼

ありがとうございます。
新しいインスタンスを作成して、それを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:15

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問