種類の違うボタンの処理をつくるのに、クラスを使うと同じ処理部分を省略できて楽だと知り
初めてクラスを使ってみた状況です。
ベースのボタンクラスを作り、新しいクラスに継承させて、
処理を変更させたい関数を、オーバーライドし、処理の部分を変えました。
それを関数ポインタを使って処理させたいのですが
うまくビルドできません。
簡単なプログラムにしてやってみたのですが、
関数ポインタの所がうまくいってないようです。
#include "DxLib.h"
class base
{
public:
void (base::*func[2])();// 関数ポインタ
base();// コンストラクタ
virtual void a1();
virtual void a2();
void b( int i);
};
base::base()
{
func[0] = &base::a1;
func[1] = &base::a2;
}
void base::a1()
{
DrawFormatString(100, 100,GetColor(255,255,255), "0" );
}
void base::a2()
{
DrawFormatString(100, 100,GetColor(255,255,255), "1" );
}
void base::b( int i)
{
if(i==0 || i==1)
{
(this->*func[i])();
}
}
}
(this->*func[i])();
}
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
//--- ▼ 前処理 ▼ ---
SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定
base base1;
while(ProcessMessage()==0 && ClearDrawScreen()==0)
{
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
//--- ▼ ココから ▼ ---
base1.b(1);
ScreenFlip();//裏画面を表画面に反映
//--- ▲ ココまで ▲ ---
}
DxLib_End();
return 0;
}
このクラスbaseを継承させた派生クラスbを作って、
上位のクラスbaseから継承してきたメソッドを再定義してビルドをするとできません。
#include "DxLib.h"
class base
{
public:
void (base::*func[2])();// 関数ポインタ
base();// コンストラクタ
/////////////////////////
virtual void a1();// virtual を追加
virtual void a2();
/////////////////////////
void b( int i);
};
base::base()
{
func[0] = &base::a1;
func[1] = &base::a2;
}
void base::a1()
{
DrawFormatString(100, 100,GetColor(255,255,255), "0" );
}
void base::a2()
{
DrawFormatString(100, 100,GetColor(255,255,255), "1" );
}
void base::b( int i)
{
if(i==0 || i==1)
{
(this->*func[i])();
}
}
///////////////////////////////////////////
//↓ 追加した所
///////////////////////////////////////////
class test :public base
{
public:
test();// コンストラクタ
void a1();
void a2();
};
test::test()
{
func[0] = &test::a1;
func[1] = &test::a2;
}
void test::a1()
{
DrawFormatString(100, 100,GetColor(255,255,255), "3" );
}
void test::a2()
{
DrawFormatString(100, 100,GetColor(255,255,255), "4" );
}
///////////////////////////////////////////
//↑ 追加した所
///////////////////////////////////////////
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
ChangeWindowMode(TRUE);//ウィンドウモード
if(DxLib_Init() == -1 || SetDrawScreen( DX_SCREEN_BACK )!=0) return -1;//初期化と裏画面化
//--- ▼ 前処理 ▼ ---
SetDrawScreen( DX_SCREEN_BACK );//描画先を裏画面に設定
test test1;
while(ProcessMessage()==0 && ClearDrawScreen()==0)
{
//↑メッセージ処理 ↑画面をクリア ↑入力状態を保存 ↑ESCが押されていない
//--- ▼ ココから ▼ ---
test1.b(1);
ScreenFlip();//裏画面を表画面に反映
//--- ▲ ココまで ▲ ---
}
DxLib_End();
return 0;
}
うまく関数ポインタを使って、派生クラスtestのa1と、a2
の処理ができるようにしたいです。
派生クラスで関数ポインタを使い、オーバーライドした関数を使う方法、
派生クラスの関数ポインタの使い方が調べてもよくわからないので教えて欲しいです。
よろしくお願いします。