関数へオブジェクトを値渡しすると、一時オブジェクトが発生するので、デストラクタが複数回呼び出される問題を前回取り上げました。
この問題を解決する方法は、実はあなたはご存知です。

想4:この問題を解決する方法とは?


そう、ポインタはどこから見ても同じメモリ上のアドレスを表すが故に、オブジェクトのコピーが行われると不都合になるのでした。
であればそのポインタを利用してやればよいのです。
実値ではなく、実値を指すポインタ変数を渡す関数を作成してみましょう。

C++では、一番下の関数PowerUPは、中段のPowerUPと引数が異なるので、違う関数として扱われます。名前が同じで引数が違う関数を作成することを、関数をオーバーロードするとも言います(戻り値が違っても引数が同じであれば同じ関数として扱われ、コンパイルエラーとなります)

新しく作成したPowerUP関数では、オブジェクトを直接受け取らず、オブジェクトへのポインタ変数を受け取ります。ポインタ変数とは、単にアドレスが入った変数のことでした。
つまりこの関数はオブジェクトのアドレスを受け取るということです。
なので、PowerUPを使用する時は、PowerUP(&Enemy1);と書くことができます。

今まで、クラスのメンバーへアクセスする際は、.を使ってきましたが、それはオブジェクトから直接アクセスする場合においてです
オブジェクトのアドレスが格納されたポインタ変数からメンバーへアクセスする時は、->を使います。
これはただの文法規則なので意味は洞察しないで下さい。
オブジェクトから直接アクセス .
オブジェクトのアドレスが格納された、オブジェクト型のポインタ変数からのアクセス ->


また、->(アロー演算子)で実値を表現しているので、オブジェクト型においては*で実値を表現する必要はありません。

アローでの実値の表現(オブジェクト)ep->HP
アスタリスクでの実値の表現(整数)*HP


更に、ポインタによってオブジェクトを遠隔で直接操作しているのでreturnで値を返す必要はありません。



これでエラー落ちすることはなくなりました。
なぜならデストラクタが呼び出されないからです。
再びiostreamをEnemyCharacter.hにインクルードし、デストラクタが呼び出されているか確認してみましょう。

159

デストラクタは呼ばれませんでした! 関数も正しく動作しています。