• ベストアンサー

それって演算子の多重定義じゃないんですか?

今日 http://oshiete1.goo.ne.jp/kotaeru.php3?q=119986 で回答しました。 私としては、質問に対する最もまともな回答をしたつもりでしたが、 反応すらなかったので、「あれ? なんか間違ってんのかな?」と 思ったしたいです。 で、普段からC++でプログラム組んでいる人に伺いたいんですが、 これって質問に対する答えとして相当間違った方向なのでしょうか?

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

  • ベストアンサー
  • mkii
  • ベストアンサー率40% (43/105)
回答No.4

私のコードの利点は 構造体のメンバを増やしても関数pointplusを変更しなくてもよい です。 例えば、 struct point{  union {   struct {    int x;    int y;    int z;    int z2;   };   int member[4];  }; }; としても関数pointplusは変更せずに済みます。 それから、以下の2つのパターンですが、 1. pointplus(足し先点、足し元点1、足し元点2) 2. 足し先点 = pplus(足し元点1、足し元点2) 2のパターンだと、復帰値で構造体のメンバのコピーが発生するので、 1のパターンの直接変更の方が無駄がありません。

kokucho81
質問者

お礼

あ、そうかなるほど。。。。 良く考えると、(技法としては一見特殊に見えますが)考え方は至ってしごくまっとうですよね。 メンバーに名前をつけると共に、テーブル化して走査できるようにしてしまう、 こんな手法ってあったんですね。。。(しらんかったですまじで。。。) うーむ。妙なところで妙な収穫を得ましたです。。。 ありがとうございました。

その他の回答 (3)

  • mkii
  • ベストアンサー率40% (43/105)
回答No.3

みなさん言うとおりCのみの話でありC++ではないのでしょう。 C++に慣れるとあのコードで普通ですね。 Cのみでも以下のようにすればできると思うんですが、 あっさり締めきられちゃいましたね(笑) struct point{  union {   struct {    int x;    int y;    int z;   };   int member[3];  }; }; void pointplus(struct point *pa, struct point *pp1, struct point *pp2) {  int i;  for (i = sizeof (pa->member) / sizeof (int) - 1; i >= 0; i --)   pa->member[i] = pp1->member[i] + pp2->member[i]; }

kokucho81
質問者

お礼

mkii さん、アドバイスありがとうございます。 おぉ!? これは? 無名の共用体ですね。。。たしかに、これで member配列に入れた値が、x,y,zにてアクセスできますが。。。 (ちょっとこれは思いつかなかったです。。。) しかし、、結局 1. pointplus(足し先点、足し元点1、足し元点2) という形ですから、 2. 足し先点 = pplus(足し元点1、足し元点2) と大して変わんない気もするのですが、、、 なんかすごい(記述上などの)利点があるのでしょうか? (私の勉強不足ですか?)

回答No.2

質問者の質問や補足からは「C++」という言葉は一言も 出ていなかったので「C++」ではなく「C」での 質問であると(解答者のみなさんが)判断したんだろうと想像します。 「C++」でという条件がある場合は、演算子のオーバロードのほうがより最適な解答だと、私も思います。

kokucho81
質問者

お礼

shuyamakawaさま、アドバイスありがとうございます。 >質問者の質問や補足からは「C++」という言葉は一言も >出ていなかったので「C++」ではなく「C」での そうですね。そこは私もおもいました。 少なくとも質問者の方が知っているのはC言語の範囲であろうとは思いました。 と、同時に、環境等々において、何も記述なさってはいなかったので、 #「多分WindowsでVC++かBC++」あたりを使ってC言語勉強中かな~ #「そうでなければ、学校でUNIXのGNU GCC」をつかって勉強中なのだろうか。 、、、うーむ、とすれば、とりあえず(本人はC++使ってないけれど、 多分C++が動く環境だろうから)カット&ペーストで使えるように 回答しとくのが一番かな~。。。 と思ってあんな感じになったのですが、、、撃沈でした。。。 とりあえず、「C++なら妥当」と言って頂いたので、 その点では、安心できました。

noname#9414
noname#9414
回答No.1

読んでみました。 確かに一番無難そうな回答ですね。 ただ、補足やお礼を見てみると、「お早い回答」と 書かれているので、もしかしたらkokucho81様が回答 したのとほぼ同じ時間にお礼を書き込んでいて、 質問者の方は、kokucho81様の回答を読んでいない のではないでしょうか? 書き込んでいる間の時間というのは、表示される ページが更新されないので、結構こういうことは 起こりがちです。 Pointがつかない・・・だから回答しないとならずに、 誰か困っている人のためとこれからもがんばって 回答していれば、質問者の方にも心は伝わると 思いますよ。 #別に回答するのは競争ではないと思いますし・・・ #まぁ、Pointがもらえればうれしいのは確かですが。 ではでは☆

kokucho81
質問者

お礼

Kanata様。 私のわがまま勝手な疑問にアドバイス頂きありがとうございます。 >書き込んでいる間の時間というのは、表示される >ページが更新されないので、結構こういうことは >起こりがちです。 そうですね~。もしかしたら質問者の方がお礼をカキカキしている間に、 私がコネコネ回答していたのかもしれないですね~。(はぅ~ とりあえず、回答の方向性としては、それなりに妥当性の有るものでは あったということが確認できて良かったです。 >Pointがつかない・・・だから回答しないとならずに、 >誰か困っている人のためとこれからもがんばって いえ、より一層回答の「質」を高めていこうと思いました。 目指すところは、「500回答で5000点」なので。。。 #私の勝手な目標なのですが、そうやって、 #自分なりに目標点立ててやるのもありかなと。。。 #って話それてる。。。(= =;)