トップページ⇒tech
19コメント7KB

クラスの中で関数ポインタ

■ このスレッドは過去ログ倉庫に格納されています
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デフォルトの名無しさんNGNG
FAQ中のFAQやね。
00041NGNG
ぐは〜、寝てた…。皆さんおはようさん。
親切な深夜の友2さん、ありがとう。今ちょっと試せないから後で試して報告するね。それじゃ。
00051NGNG
1です。今試してみたところばっちりうまく通りました。
こんな記法しらなかったよ。まじサンクスっす。
00061NGNG
続報です。
コンパイルは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++をよくわかってないのだと思いますが…
00071NGNG
あ、書き忘れ。
init()のなかでstateは初期化されているとします。
00081NGNG
またまた書き忘れ、もいっかい書き直します。スマソ…。

class 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;
}
00092NGNG
なんてこった!意図がうまく伝わらなかったようだな。要するに、privateな
スレはみんなからアクセスできないから、こういう場合は( ゚Д゚)ギコに訊けと。
あるいはなんとかpublicにするか・・・、まいいか、どうでも

(*func_pointer[state])();を
(this->*func_pointer[state])();に
00101NGNG
あちゃぁ、そういう意味だったのね。>2さん
今後は気をつけまっさ。

あと、thisポインタでうまく実行できま> あと、thisポインタでうまく実行できましたがもう一つ疑問がでてきました。
ギコ猫の方で質問しますんでまたよろしくお願いしますね。
0011デフォルトの名無しさんNGNG
つーかなんで関数オブジェクトとか使わないのん?
0012デフォルトの名無しさんNGNG
「クラスの間違った使い方」で出てきそうな例だね。
0013デフォルトの名無しさんNGNG
class Command{virtual void func()=0;}
class Command1 : public Command{void func();}
class Command2 : public Command{void func();}
class Command3 : public Command{void func();}

とかにして、Command1〜3のインスタンスの配列かなんか
作ってCommand::func()を起動するのが、普通のC++だよね。

vptrが遅い(そんなもんが気になるようならそもそもC++使うな!)
からあえて使わないとか、そういう話は無いという仮定だけど。
001412NGNG
C++ で関数ポインタを使うと、
13 さんの言う通りで、型チェックの恩恵を受けられないですよん。

まぁコールバック関数とか、APIでどうしても関数ポインタを
要求してるという場合はまた話が違いますけど。
001513NGNG
こういう、C++わかってないCオンリーの人に、勉強時間与えないで
いきなり仕事させるのやめて欲しいよ〜。特に、設計だけはさせないで
欲しいよ〜。

Cオンリーの人のコードって、設計が物凄い事(Cルール的には普通かも
しれないけどC++ルール的には普通じゃないコード)になるので、ちょっと
修正ってわけにも逝かないんだよ〜。
001612NGNG
何故あなたが12の名を語っているのか、私にはそれが不思議でならない。
001712NGNG
↑
は14へのレス。
001811NGNG
>>12
ごめんまちがえた
001911NGNG
あ、そういえばこのコードってひょっとして
ステートマシンとかオートマトンを作ろうとしてるの?

なら State パターン使うのはどーよ。

■ このスレッドは過去ログ倉庫に格納されています