【C++】演算子のオーバーロードを使って美しいコーディングを

2次元のベクトルを管理するクラスを作ってみる。ベクトルというと高校数学で習ったあれだが、ここでは、その数学のベクトルの機能になるべく忠実になるように設計してみる。
設計を進めていくうちに演算子のオーバーロードがとても有り難く美しい文法であることが分かるようになるだろう。

ここではヘッダーファイルに記述するものしか載せない。実装内容は以下のリンクにある。

とりあえずクラス宣言を行う。次元数は2なので2という数字を加えておく。

class Vec2{

ベクトルの要素はxとy。

private:
   int _x;
   int _y;

適当にコンストラクタを配置。最初にxとyを指定する。

public:
    Vec2(int x, int y);

要素を何も指定しない場合も作っておく。これが呼び出されたら零ベクトルにしておけば良いだろう。

Vec2();

各要素を取り出せるようにしておこう。

int getX() { return _x; }
int getY() { return _y; }

各要素が指定できるようにしておこう。

void setX(int x) { _x = x; }
void setY(int y) { _y = y; }

ここまではクラスを作る際のテンプレである。おまけに移動できるようなメソッドもあったら便利だ。

void move(int dx, int dy);

ここからはベクトル特有の機能を作っていく。ベクトルは実数との乗除に、他のベクトルとの加減に対応している。また、それらの演算時に、x,yという二つの変数を一気に操作できるところに魅力がある。例えばベクトルpがベクトルaとベクトルbの足し算であるという式は

p=a+b


と表されるが、ここではaとbのxの合計がpのxに、aとbのyの合計がpのyに代入されるという2つの計算が裏で行われている。
他の例として、ベクトルpがベクトルmのk倍であるという式は

p=km

と表されるが、ここではmのxにkをかけた数がpのxに、mのyにkをかけた数がpのyに代入されるという2つの計算が行われている。

どうやらベクトルの加減乗除は普通の数値であるdoubleやintの加減乗除とは違そうだ。
そこで登場するのが演算子のオーバーロードである。これを使ってベクトルの加減乗除も普通の数値の加減乗除と同じ見た目でできるようにしてしまおう。

Vec2 operator*(double ratio);
Vec2 operator/(double ratio);
Vec2 operator+(Vec2 x);
Vec2 operator-(Vec2 x);

例えば一番目のoperator*(double ratio)の実装は

return Vec2(_x*ratio,_y*ratio);

となる。自分のxとyにそれぞれratioをかけた数をxとyに入れた新しいVec2を返せば数学の書く式と似た見た目のコードでVec2を操作することができる。先ほどの掛け算を実際にやろうとすればこうコーディングすればよい。

Vec2 m(2,5)

とした後に

Vec2 p=m*5

を実行するとpがしっかり(10,25)となっている。

これまで作ってきたものは演算であるが、プログラミングには自己の変数を更新するという機能がある。これも演算子のオーバーロードが可能なので作ってしまおう。

void operator*=(double ratio);
void operator/=(double ratio);
void operator+=(Vec2 v);
void operator-=(Vec2 v);

あとは下のようなメソッドを用意した。

bool operator==(Vec2 v);
void operator=(Vec2 v);

さて、これらはどのような動作をするか。以下の実装を見て是非確認を。


わっしょいわっしょい!

パメル

学生。「考えることを止めない」ことが一番大事だと思う。 休日にやっていることはピアノとゴルフと音楽制作と散歩。 プログラミングを勉強しています。
コメントを投稿するには、 ログイン または 会員登録 をする必要があります。