新ゲームプログラミングの館 sp.6「メニュー画面の作り方 (C++編)」の
の (BaseScene*) と this がよくわかりません
(BaseScene*) は mScene が BaseScene* 型で new Menu(this) がMenu* 型なので
キャストしている(アップキャストなのでなくてもいい)
this は SceneMgr のポインタだけど Menu(ISceneChanger* changer); と
Menu のコンストラクタの引数が ISceneChanger* 型なので、
Menu は SceneMgr が ISceneChanger から継承した ChangeScene にしかアクセスできない
Menu(SceneMgr* changer); にするとすべての関数にアクセスできてしまう
と考えたのですが合ってますか?
メニュー画面の作り方 (C++編)について
Re: メニュー画面の作り方 (C++編)について
アップキャストなのでなくてもいい、というか書いてはいけないと思います。パル さんが書きました:(BaseScene*) は mScene が BaseScene* 型で new Menu(this) がMenu* 型なので
キャストしている(アップキャストなのでなくてもいい)
元記事はアップキャストを明示する目的で書いたのかもしれませんが、そのような思考の過程をコードに持ち込むのは良くないと思います。
仮に基底クラスを別の名前のものに差し替える場合、変更する手間が増えるだけです。
同じようなことは元記事に書かれていますが、ネガティブではなくポジティブに理解するほうが良い気がします。パル さんが書きました:this は SceneMgr のポインタだけど Menu(ISceneChanger* changer); と
Menu のコンストラクタの引数が ISceneChanger* 型なので、
Menu は SceneMgr が ISceneChanger から継承した ChangeScene にしかアクセスできない
Menu(SceneMgr* changer); にするとすべての関数にアクセスできてしまう
シーンの変更は、シーンを管理するオブジェクトに対してISceneChangerインターフェースを使ってChangeSceneメソッドを呼び出す。
このプログラムはそのように設計されました。
シーンの変更に必要なのはそれだけです。
SceneMgrが、ISceneChangerを継承してシーンの管理を担うように実装されました。
なのでここではthisを渡すのが適当です。
複数のインターフェースを扱う複雑なプログラムになれば、インターフェースを継承だけで実装することができなくなることがあります。
そのような場合はインターフェースを取得するメソッドを用意して、インターフェースが欲しい場面でそれを呼び出すといった方法をとります。
Re: メニュー画面の作り方 (C++編)について
回答ありがとうございます
なんとなくしっくりこなかったのですが理解できました
わかりましたISLe さんが書きました:アップキャストなのでなくてもいい、というか書いてはいけないと思います。
元記事はアップキャストを明示する目的で書いたのかもしれませんが、そのような思考の過程をコードに持ち込むのは良くないと思います。
仮に基底クラスを別の名前のものに差し替える場合、変更する手間が増えるだけです。
SceneMgrのポインタを渡したのにその一部にしかアクセスできないというのがISLe さんが書きました:同じようなことは元記事に書かれていますが、ネガティブではなくポジティブに理解するほうが良い気がします。
シーンの変更は、シーンを管理するオブジェクトに対してISceneChangerインターフェースを使ってChangeSceneメソッドを呼び出す。
このプログラムはそのように設計されました。
シーンの変更に必要なのはそれだけです。
SceneMgrが、ISceneChangerを継承してシーンの管理を担うように実装されました。
なのでここではthisを渡すのが適当です。
複数のインターフェースを扱う複雑なプログラムになれば、インターフェースを継承だけで実装することができなくなることがあります。
そのような場合はインターフェースを取得するメソッドを用意して、インターフェースが欲しい場面でそれを呼び出すといった方法をとります。
なんとなくしっくりこなかったのですが理解できました