クラスを使った関数ポインタについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Rom
記事: 25
登録日時: 10年前
住所: 日本

クラスを使った関数ポインタについて

#1

投稿記事 by Rom » 9年前

現在STGを作成しておりますがちょっと自分の知識では解決できなさそうな問題が発生したので質問させていたただきたい

龍神録プログラミングの館の12章を参考に、というかほぼそのまま使って敵の出現、動きを作成しているところなのですが
関数ポインタがうまく使えません

というのも自分のプログラムはクラスを使って作成しているからなのだと思われます

コード:

//enemy.h
class ENEMY
{
private:

public:

------------------省略--------------------
	void enemy_pattern0(Ch& enemy);		
	void enemy_pattern1(Ch& enemy);		
	void enemy_pattern2(Ch& enemy);		
	void enemy_pattern3(Ch& enemy);		
	void enemy_pattern4(Ch& enemy);		
};
となっており、enemy.cppにenemy_pattern0などの実態があります
そこで

コード:

void (*enemy_pattern[ENEMY_PATTERN_MAX])(Ch&) = {
    enemy_pattern0,    enemy_pattern1,    enemy_pattern2,    enemy_pattern3,    enemy_pattern4,};
を追加したいのですが

1>o:\project\dxlib\stg3\source\enemy.cpp(6) : error C3867: 'ENEMY::enemy_pattern0': 関数呼び出しには引数リストがありません。メンバへのポインタを作成するために '&ENEMY::enemy_pattern0' を使用してください
1>o:\project\dxlib\stg3\source\enemy.cpp(6) : error C2440: '=' : 'void (__thiscall ENEMY::* )(Ch &)' から 'void (__cdecl *)(Ch &)' に変換できません。

というようなのがenemy_pattern1,2,3,4についてもでてきます
関数ポインタをメンバ関数にしてみたり、グローバル関数にしてみたりしましたがうまくいきませんでした
クラスを使ったことによって引き起こされているのはなんとなく分かるのですが・・・


こういう書き方があるよーとか教えていたただきたいのです
よろしくお願いします

アバター
へろりくしょん
記事: 92
登録日時: 10年前
住所: 福岡

Re: クラスを使った関数ポインタについて

#2

投稿記事 by へろりくしょん » 9年前

そのまんま、エラーメッセージに従えばいいですよ。

void (ENEMY::*enemy_pattern[ENEMY_PATTERN_MAX])(Ch&) = {
  &ENEMY::enemy_pattern0, &ENEMY::enemy_pattern1, &ENEMY::enemy_pattern2, &ENEMY::enemy_pattern3, &ENEMY::enemy_pattern4
};

メンバ関数は暗黙的に this ポインタが渡されます。 逆に言うと必ず渡されなければなりません。
ので、void (*enemy_pattern[ENEMY_PATTERN_MAX])(Ch&)  という宣言では不都合であることが分かりますね。

また、続く = {enemy_pattern0, enemy_pattern1, enemy_pattern2, enemy_pattern3, enemy_pattern4,}; の部分も同じです。

Rom
記事: 25
登録日時: 10年前
住所: 日本

Re: クラスを使った関数ポインタについて

#3

投稿記事 by Rom » 9年前

へろりーなさんありがとうございます。
いまいち意味はわかってませんが些細な問題だと思ってます とりあえず動くものを目指してます
該当部分についてはうまくいったようなのですが・・・

コード:

////enemy.h////
typedef struct{
	double x,y;
	int life;
	int lifemax;
	int range;
	int img;

	double angle;
	int type;
	int pattern;    //←今関係あるのはこれだけです////
	int cnt;
	double spd;
	int atktime,atktype;
	int bltype;		//弾の種類
	int wait;
	double vx,vy;
}Ch;
class ENEMY
{
private:

public:
-----------------省略-----------
   void Move();
   void Init();
   void (ENEMY::*enemy_pattern[ENEMY_PATTERN_MAX])(Ch&);
   void enemy_pattern0(Ch& enemy);	
   void enemy_pattern1(Ch& enemy);		
   void enemy_pattern2(Ch& enemy);		
   void enemy_pattern3(Ch& enemy);		
   void enemy_pattern4(Ch& enemy);	
};

/////enemy.cpp//////	
void ENEMY::init(){
	enemy_pattern[0] = &ENEMY::enemy_pattern0;
	enemy_pattern[1] = &ENEMY::enemy_pattern1;
	enemy_pattern[2] = &ENEMY::enemy_pattern2;
	enemy_pattern[3] = &ENEMY::enemy_pattern3;
	enemy_pattern[4] = &ENEMY::enemy_pattern4;
}
void ENEMY::Move(){
    it = zakolist.begin();
    while(it!=zakolist.end()){
	    if((*it).y>620 || (*it).y < -100 || (*it).life<1){
	    	it = zakolist.erase(it);
	    }else{
		    enemy_pattern[(*it).pattern]((*it));  /////////ココ!
       --------------------省略---------------------------------------
			 it++;
		 }
	 }
}
とこんなふうなのですが、「ココ!」と書いてる部分がうまくいきません
1 引数を取り込む関数には評価されません
というエラーが出ますが日本語的にも意味がわからないです。listを使っていることが関係しているような・・・
丸投げで本当にすみません

アバター
へろりくしょん
記事: 92
登録日時: 10年前
住所: 福岡

Re: クラスを使った関数ポインタについて

#4

投稿記事 by へろりくしょん » 9年前

(this->*enemy_pattern[(*it).pattern])((*it)); とします。

Rom
記事: 25
登録日時: 10年前
住所: 日本

Re: クラスを使った関数ポインタについて

#5

投稿記事 by Rom » 9年前

すみません本当にありがとうございました

閉鎖

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