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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
パル

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

#1

投稿記事 by パル » 10年前

新ゲームプログラミングの館 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); にするとすべての関数にアクセスできてしまう

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

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

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

#2

投稿記事 by ISLe » 10年前

パル さんが書きました:(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++編)について

#3

投稿記事 by パル » 10年前

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

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る