C++を勉強中の者で、基礎的なことが読んでもわからないので、ご教授をお願いしたいです。
まず、このサイト(
https://dixq.net/g/)の
「新・ゲームプログラミングの館/メニュー画面の作り方/sp6章メニュー画面の作り方(C++編)」(
https://dixq.net/g/sp_06.html)
についての質問なのですが、
インターフェースでのthisポインタの意味が分かりません。
ここでは、ISceneChangerというインターフェースを用意して、それらをBaseSceneに実装することにより、Game・Menu・Config内で、SceneMgrに定義されたChangeSceneを使用可能にしています。
そして、SceneMgr内で、GameかMenuかCofigを呼び出す際に引数として、thisポインタを渡しています。(SceneMgr.cppでの操作)
このthisポインタは、最終的にmSceneChanger(BaseScene.hで定義したISceneChangerポインタ型変数)に代入されるのでしょうが、わざわざ、mSceneChangerへのthisポインタ渡しの操作をしなくてもいい気がしてしまいます。
この記事には、
「そのインスタンスポインタをGameモジュールなどに渡して使うことでSceneMgrに実装した「ChangeSceneのみに」アクセスが可能になるわけです。」
と、書かれていますが、なぜ「そのインスタンスポインタ(thisポインタ?)」を渡すことでそれが可能になるのかが分かりません。
まだ勉強中の身ゆえ、稚拙な質問になってしまいましたが、どうか解答の方よろしくお願いします。
また、失礼な事を言ってしまっていたらご指摘お願いしますm(_ _)m
////////////////////////// SceneMgr.cpp ///////////////////////
#include "DxLib.h"
#include "Config.h"
#include "Game.h"
#include "Menu.h"
#include "SceneMgr.h"
SceneMgr::SceneMgr() :
mNextScene(eScene_None) //次のシーン管理変数
{
mScene = (BaseScene*) new Menu(this);
}
//初期化
void SceneMgr::Initialize(){
mScene->Initialize();
}
//終了処理
void SceneMgr::Finalize(){
mScene->Finalize();
}
//更新
void SceneMgr::Update(){
if(mNextScene != eScene_None){ //次のシーンがセットされていたら
mScene->Finalize();//現在のシーンの終了処理を実行
delete mScene;
switch(mNextScene){ //シーンによって処理を分岐
case eScene_Menu: //次の画面がメニューなら
mScene = (BaseScene*) new Menu(this); //メニュー画面のインスタンスを生成する
break;//以下略
case eScene_Game:
mScene = (BaseScene*) new Game(this);
break;
case eScene_Config:
mScene = (BaseScene*) new Config(this);
break;
}
mNextScene = eScene_None; //次のシーン情報をクリア
mScene->Initialize(); //シーンを初期化
}
mScene->Update(); //シーンの更新
}
//描画
void SceneMgr::Draw(){
mScene->Draw(); //シーンの描画
}
// 引数 nextScene にシーンを変更する
void SceneMgr::ChangeScene(eScene NextScene){
mNextScene = NextScene; //次のシーンをセットする
}
///////////////////////////// BaseScene.h /////////////////////////
#pragma once
#include "Task.h"
#include "ISceneChanger.h"
//シーンの基底クラス。
class BaseScene : public Task {
protected:
int mImageHandle; //画像ハンドル格納用変数
ISceneChanger* mSceneChanger; //クラス所有元にシーン切り替えを伝えるインターフェイス
public :
BaseScene(ISceneChanger* changer);
virtual ~BaseScene(){}
virtual void Initialize() override {} //初期化処理をオーバーライド。
virtual void Finalize() override ; //終了処理をオーバーライド。
virtual void Update() override {} //更新処理をオーバーライド。
virtual void Draw() override ; //描画処理をオーバーライド。
};