ページ 11

クラスの関数ポインタがうまくいきません

Posted: 2016年4月10日(日) 17:55
by つくばさん
++,プログラミングを始めたばかりのものです。
プログラム中によくわからないことが起こったので質問させていただきます。
今回
http://dixq.net/forum/blog.php?u=53&b=5962
を参考にして関数の管理をしようとして次のようなプログラムを組みました。

コード:

#include "DxLib.h"
#include <vector>
 
using namespace std;

class CPointer{
protected:
	void Func00();
	void Func01();
	void Func02();
public:
typedef void (CPointer::*FUNC)();
	vector<FUNC> mFuncPtr;

	void setFunc();
};
 
void CPointer::setFunc(){
	mFuncPtr.push_back(&CPointer::Func00);
	mFuncPtr.push_back(&CPointer::Func01);
	mFuncPtr.push_back(&CPointer::Func02);
}
void CPointer::Func00(){printfDx("FUNC00");}
void CPointer::Func01(){printfDx("FUNC01");}
void CPointer::Func02(){printfDx("FUNC02");}


int WINAPI WinMain(HINSTANCE,HINSTANCE,LPSTR,int){
	SetUseFPUPreserveFlag(TRUE);
	ChangeWindowMode(TRUE), DxLib_Init(); //ウィンドウモード変更
	CPointer* test;
	test = new CPointer;
	test->setFunc();
	test->mFuncPtr[0]();

	WaitKey();
	DxLib_End();// DXライブラリ終了処理
	return 0;
}
すると

コード:

error C2064: 0 引数を取り込む関数には評価されません。
というエラーが出ました。
環境は環境は
win7 64bit
VC++ 2010 Express
DxLIb
です。
url に書かれてるようにするにはどうすればいいのでしょうか?
初心者ですがよろしくお願いします。

Re: クラスの関数ポインタがうまくいきません

Posted: 2016年4月10日(日) 18:59
by みけCAT
メンバ関数を呼ぶにはその関数を呼ばれるオブジェクトのインスタンスを指定しないといけないので、

コード:

test->mFuncPtr[0]();
のかわりに

コード:

(test->*test->mFuncPtr[0])();
とするといいようです。

c++ - How do I call a pointer-to-member-function? - Stack Overflow

Re: クラスの関数ポインタがうまくいきません

Posted: 2016年4月10日(日) 19:18
by つくばさん
みけCATさんありがとうございました。
おっしゃられている通りに直すとしっかり作動しました。
ご協力ありがとうございました。