ページ 11

メニュー画面の作り方 (C++編)について

Posted: 2014年3月16日(日) 20:00
by パル
新ゲームプログラミングの館 sp.6「メニュー画面の作り方 (C++編)」の

コード:

 //SceneMgr.cpp
mScene = (BaseScene*) new Menu(this);   //メニュー画面のインスタンスを生成する 
の (BaseScene*) と this がよくわかりません

(BaseScene*) は mScene が BaseScene* 型で new Menu(this) がMenu* 型なので
キャストしている(アップキャストなのでなくてもいい)

this は SceneMgr のポインタだけど Menu(ISceneChanger* changer); と
Menu のコンストラクタの引数が ISceneChanger* 型なので、
Menu は SceneMgr が ISceneChanger から継承した ChangeScene にしかアクセスできない
Menu(SceneMgr* changer); にするとすべての関数にアクセスできてしまう

と考えたのですが合ってますか?

Re: メニュー画面の作り方 (C++編)について

Posted: 2014年3月17日(月) 21:46
by ISLe
パル さんが書きました:(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++編)について

Posted: 2014年3月18日(火) 21:03
by パル
回答ありがとうございます
ISLe さんが書きました:アップキャストなのでなくてもいい、というか書いてはいけないと思います。
元記事はアップキャストを明示する目的で書いたのかもしれませんが、そのような思考の過程をコードに持ち込むのは良くないと思います。
仮に基底クラスを別の名前のものに差し替える場合、変更する手間が増えるだけです。
わかりました
ISLe さんが書きました:同じようなことは元記事に書かれていますが、ネガティブではなくポジティブに理解するほうが良い気がします。

シーンの変更は、シーンを管理するオブジェクトに対してISceneChangerインターフェースを使ってChangeSceneメソッドを呼び出す。
このプログラムはそのように設計されました。
シーンの変更に必要なのはそれだけです。

SceneMgrが、ISceneChangerを継承してシーンの管理を担うように実装されました。
なのでここではthisを渡すのが適当です。

複数のインターフェースを扱う複雑なプログラムになれば、インターフェースを継承だけで実装することができなくなることがあります。
そのような場合はインターフェースを取得するメソッドを用意して、インターフェースが欲しい場面でそれを呼び出すといった方法をとります。
SceneMgrのポインタを渡したのにその一部にしかアクセスできないというのが
なんとなくしっくりこなかったのですが理解できました