質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

810閲覧

opratorにおいてthis*と変数でreturn する方法はどっちが正しいのか?

退会済みユーザー

退会済みユーザー

総合スコア0

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/09/08 08:07

//////コメント内部のコードですがthis版と変数版どっちが正しいのでしょうか?内容よりも適切な方法があれば教えていただきたいです。

class Matrix { public: float x; float y; float z; float w; //コンストラクタ Matrix() { x = 0.0; y = 0.0; z = 0.0; w = 0.0; } Matrix(Position p) { x = p.x; y = p.y; z = p.z; w = 1.0f; } Matrix(float xx, float yy, float zz, float ww) { x = xx; y = yy; z = zz; w = ww; } Matrix(float xx, float yy, float zz) { x = xx; y = yy; z = zz; w = 1.0f; } //////////////////////////////////////////////////////////////////////// //this版 Matrix operator * (Matrix M) { this->x = (x * 1) + (y * 0) + (z * 0) + (w * M.x); this->y = (x * 0) + (y * 1) + (z * 0) + (w * M.y); this->z = (x * 0) + (y * 0) + (z * 1) + (w * M.z); this->w = (x * 0) + (y * 0) + (z * 0) + (w * M.w); return *this; } //変数版 Matrix operator * (Matrix M) { Matrix t; t.x = (x * 1) + (y * 0) + (z * 0) + (w * M.x); t.y = (x * 0) + (y * 1) + (z * 0) + (w * M.y); t.z = (x * 0) + (y * 0) + (z * 1) + (w * M.z); t.w = (x * 0) + (y * 0) + (z * 0) + (w * M.w); return t; } //////////////////////////////////////////////////////////////////////// };

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

変数版のほうが適切です。

a * bという演算を行ったらaが書き換わった、なんて挙動は、通常期待されません。むしろ、Matrix operator * (const Matrix & M) constのように、引数もthisconst指定するぐらいが適切です。

投稿2020/09/08 08:14

編集2020/09/08 08:18
maisumakun

総合スコア146063

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/08 08:16

this版は左側?が変わってしまうということでしょうか?
maisumakun

2020/09/08 08:17

そうですね、a * bのようにした場合、a.operator *(b)の呼び出しとして解釈されます。
退会済みユーザー

退会済みユーザー

2020/09/08 08:19

じゃあthis*という使い方は絶対ダメという話になりますがプログラムは言葉なので絶対やってはいけない言葉をあるということでよろしいでしょうか?
maisumakun

2020/09/08 08:21 編集

> じゃあthis*という使い方は絶対ダメという話になりますが なりません。逆に、thisを書き換えるoperator *=を実装する場合は*thisを返すのが適切です。
maisumakun

2020/09/08 08:22

(operator*でthisを書き換えるクラスを作ることも「文法的」には可能ですが、使い勝手がものすごく悪くなるのでやらない、というだけです。)
guest

0

既にベストアンサーがついていますが補足で説明致します。
this版はこの場合、***=**のオペレーターになってしまっています。
つまり、適切ではないです。
下記のようにすることで、貴方のやりたかったことが出来るのではないでしょうか?

Matrix operator * (Matrix M)const { return Matrix( (x * 1) + (y * 0) + (z * 0) + (w * M.x), (x * 0) + (y * 1) + (z * 0) + (w * M.y), (x * 0) + (y * 0) + (z * 1) + (w * M.z), (x * 0) + (y * 0) + (z * 0) + (w * M.w) ); } Matrix operator *= (Matrix M) { //thisを付けていると横幅が長くなるので、省略できるところは省略して書きましょう。 x = (x * 1) + (y * 0) + (z * 0) + (w * M.x); y = (x * 0) + (y * 1) + (z * 0) + (w * M.y); z = (x * 0) + (y * 0) + (z * 1) + (w * M.z); w = (x * 0) + (y * 0) + (z * 0) + (w * M.w); return *this; }

最後に細かいですか、このクラスの名前はMatrixではなくクォータニオン又はVector4が適切だと思います。

投稿2020/09/09 00:48

stdio

総合スコア3307

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問