クラスの中で関数ポインタ
■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん
NGNGエラーが出てきます。
error C2440: '=' : 'void (__thiscall Classname::*)(void)' から 'void (__cdecl *)(void)' に変換することはできません。
class classname{
private:
int state;
public:
void init(){
func_pointer[0]=func1;
func_pointer[1]=func2;
func_pointer[2]=func3;
}
void (*func_pointer[3])(void);
void func1(void);
void func2(void);
void func3(void);
};
上のように宣言しておいて、
func_pointer[state]();
というように実行したいのですが、どうしたらいいのでしょうか?
func1をグローバルに宣言しておけば上のエラーはでないのですが、
こんどはfunc1がクラスのメンバにアクセスできなくなってしまい困っています。
宜しくお願いします。
0002デフォルトの名無しさん
NGNG>>1
オレのお薦めはこれ、「スレ立てるまでも・・・」なんかに負けるな
http://piza.2ch.net/test/read.cgi?bbs=tech&key=980521175&ls=100
「void (__thiscall Classname::*)(void)」って言ってるんだから
void (classname::*func_pointer[3])(void);
でイイじゃんイイじゃん
0003デフォルトの名無しさん
NGNG00041
NGNG親切な深夜の友2さん、ありがとう。今ちょっと試せないから後で試して報告するね。それじゃ。
00051
NGNGこんな記法しらなかったよ。まじサンクスっす。
00061
NGNGコンパイルは5で書いたようにうまくいきましたが、
関数ポインタを実行するためのコードを書いてみたところ、
またうまくいかなくなりました。
またまた、助けてもらえないでしょうか?
コンパイラを通らないコードを以下に書きます。
class classname{
private:
int state;
public:
void init(){
func_pointer[0]=func0;
func_pointer[1]=func1;
func_pointer[2]=func2;
}
void (*func_pointer[3])(void);
void func0(void);
void func1(void);
void func2(void);
void func(){
(*func_pointer[state])();
return;
}
};
int main(){
classname* a;
a=new classname;
a->init();
a->func();//関数ポインタ実行例1
(*(a->func_pointer[0]))();//関数ポインタ実行例2
delete a;
return 0;
}
そもそも、こんな事やろうとする僕がC++をよくわかってないのだと思いますが…
00071
NGNGinit()のなかでstateは初期化されているとします。
00081
NGNGclass classname{
private:
int state;
public:
void init(){
state=0;
func_pointer[0]=func0;
func_pointer[1]=func1;
func_pointer[2]=func2;
}
void (Classname::*func_pointer[3])(void);
void func0(void);
void func1(void);
void func2(void);
void func(){
(*func_pointer[state])();
return;
}
};
int main(){
classname* a;
a=new classname;
a->init();
a->func();//関数ポインタ実行例1
(*(a->func_pointer[0]))();//関数ポインタ実行例2
delete a;
return 0;
}
00092
NGNGスレはみんなからアクセスできないから、こういう場合は( ゚Д゚)ギコに訊けと。
あるいはなんとかpublicにするか・・・、まいいか、どうでも
(*func_pointer[state])();を
(this->*func_pointer[state])();に
00101
NGNG今後は気をつけまっさ。
あと、thisポインタでうまく実行できま> あと、thisポインタでうまく実行できましたがもう一つ疑問がでてきました。
ギコ猫の方で質問しますんでまたよろしくお願いしますね。
0011デフォルトの名無しさん
NGNG0012デフォルトの名無しさん
NGNG0013デフォルトの名無しさん
NGNGclass Command1 : public Command{void func();}
class Command2 : public Command{void func();}
class Command3 : public Command{void func();}
とかにして、Command1〜3のインスタンスの配列かなんか
作ってCommand::func()を起動するのが、普通のC++だよね。
vptrが遅い(そんなもんが気になるようならそもそもC++使うな!)
からあえて使わないとか、そういう話は無いという仮定だけど。
001412
NGNG13 さんの言う通りで、型チェックの恩恵を受けられないですよん。
まぁコールバック関数とか、APIでどうしても関数ポインタを
要求してるという場合はまた話が違いますけど。
001513
NGNGいきなり仕事させるのやめて欲しいよ〜。特に、設計だけはさせないで
欲しいよ〜。
Cオンリーの人のコードって、設計が物凄い事(Cルール的には普通かも
しれないけどC++ルール的には普通じゃないコード)になるので、ちょっと
修正ってわけにも逝かないんだよ〜。
001612
NGNG001712
NGNGは14へのレス。
001811
NGNGごめんまちがえた
001911
NGNGステートマシンとかオートマトンを作ろうとしてるの?
なら State パターン使うのはどーよ。
■ このスレッドは過去ログ倉庫に格納されています