[C/C++] インスタンス返し

未だに荷物君をいぢってあーでもないこーでもないとやってる。

ゲーム内でプレイヤーやらの座標を x と y で扱うのだけど、どうせ一緒に使うのだからとまとめるためだけの class を作った。そんで、これの足し算をしたくなった。というのは

Coord posPlayer = findPlayer();  // プレイヤーが今どこにいるか

というのに対して、「右に一歩動く」という操作をしたらその動きも x, y の差分で表現しておいて、

Coord move(1, 0);
Coord dstPlayer = posPlayer + move;

と書きたい。

というわけで Coord::operator+ を書こうとしたのだけど、ちょっと考えてみたら + は新しい Coord のインスタンスを返さないといけない。上の例だと dstPlayer は posPlayer を変更したものでも move を変更したものでもなく、全く新しい Coord のインスタンスになる。

Coord のコンストラクタで x, y を受け取って

Coord dstPlayer(posPlayer.x + move.x, posPlayer.y + move.y);

でもやりたいことはできるのだが、めんどいので却下。

Coord::operator+ を何も考えないで書いたら

Coord Coord::operator+ (const Coord& other) {
   Coord tmp( (this->x + other.x), (this->y + other.y) );
   return tmp;
}

なんだけど。tmp に新しいインスタンスを作ってそれを return すると、tmp のコピーをまた作って、そんで tmp を破棄する、とかいう「なにしてんの?」と言いたくなるようなことになってしまう。かといって参照やらポインタやらを返しても tmp は破棄されてしまう。
もうちょっと考えてみたら、別に operator+ に限らず新たなインスタンスを返す関数は大抵こうなってしまう。

じゃあどうすりゃいいのよ?ってのはわからん*1のだけど、Lisp だとあんまり気にしないで新しい値作って返すのと比べて、C++ だと値を返すより破壊的に変更することが多くなるのはこーゆーのが見えてしまうからなのかな、とふと思ったり。

*1:どうしようもない気がするのだけど、まだ自分が知らない何かがあるのではないかという気もする