[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:どうしようもない気がするのだけど、まだ自分が知らない何かがあるのではないかという気もする