oparatorのデメリットとは

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
KRNKRS
記事: 40
登録日時: 12年前
連絡を取る:

oparatorのデメリットとは

#1

投稿記事 by KRNKRS » 8年前

こんにちは。
私は今、ライブラリのVAddやVSub、VScaleといったVECTOR型変数の演算関数を複数用いた場合に、個人的に「可読性が若干下がるかなぁ」と思っています。
例えばこんな感じに。

コード:

//こんなことにはまずならないとは思うけど極端な例
sumVec = VAdd(VAdd(VAdd(vec1, VAdd(vec2, VAdd(vec3, vec4)))), vec5);
そのため、oparatorで+=や*=等の演算子のオーバーロードを実装しています。
例えばこのような感じです。

コード:

//-VECTOR
VECTOR operator-(const VECTOR& vec)
{
    return VScale(vec, -1.0f);
}

//VECTOR + VECTOR
VECTOR operator+(const VECTOR& vec1, const VECTOR& vec2)
{
    return VAdd(vec1, vec2);
}

//VECTOR - VECTOR
VECTOR operator-(const VECTOR& vec1, const VECTOR& vec2)
{
    return VSub(vec1, vec2);
}

//VECTOR * float
VECTOR operator*(const VECTOR& vec1, float scale)
{
    return VScale(vec1, scale);
}

//VECTOR += VECTOR
void operator+=(VECTOR &vec1, const VECTOR& vec2)
{
    vec1 = VAdd(vec1, vec2);
}

//VECTOR -= VECTOR
void operator-=(VECTOR &vec1, const VECTOR& vec2)
{
    vec1 = VSub(vec1, vec2);
}

//VECTOR *= float
void operator*=(VECTOR &vec1, float scale)
{
    vec1 = VScale(vec1, scale);
}
これにより、

コード:

sumVec = VAdd(VAdd(VAdd(vec1, VAdd(vec2, VAdd(vec3, vec4)))), vec5);
が、

コード:

sumVec = vec1 + vec2 + vec3 + vec4 + vec5;
とすっきりします。
このように、oparatorはクラス(今回の例で言えばVECTOR)を拡張することで、
使えなかった演算を行うことができるようになるというメリットがあります。

では、逆に、oparatorを使用することで起こる弊害やデメリットなどはあるのでしょうか。
自分で調べた限りでは実装方法しか載っていないのがほとんどでデメリットを述べている(あればの話ですが)サイトが見当たらなかったのでここで質問させていただきました。

よろしくお願いいたします。

hide

Re: oparatorのデメリットとは

#2

投稿記事 by hide » 8年前

演算子の意味を逸脱しない範囲で使えば大丈夫だと思いますよ。
突然iostreamみたいなshift演算子の使い方をされたりするとちょっとびっくりするかもしれません。
下のリンクは.NET Frameworkのガイドラインです。
https://msdn.microsoft.com/ja-jp/library/cc433287

KRNKRS
記事: 40
登録日時: 12年前
連絡を取る:

Re: oparatorのデメリットとは

#3

投稿記事 by KRNKRS » 8年前

ありがとうございます!
最後に編集したユーザー KRNKRS on 2017年4月27日(木) 17:44 [ 編集 1 回目 ]

KRNKRS
記事: 40
登録日時: 12年前
連絡を取る:

Re: oparatorのデメリットとは

#4

投稿記事 by KRNKRS » 8年前

P.S.(.NET Frameworkのガイドラインより抜粋)
・演算子は、対称的な方法でオーバーロードします。等値演算子 (==) をオーバーロードする場合は、否定等値演算子 (!=) もオーバーロードする必要があります。
・ほとんどの言語は、演算子のオーバーロードをサポートしていません。このため、演算子をオーバーロードするすべての型に対し、ドメイン固有の適切な名前で、同等の機能を持つ 2 番目のメソッドを含めることが CLS では必須です。

返信

“C言語何でも質問掲示板” へ戻る