■掲示板に戻る■ ■過去ログ倉庫めにゅーに戻る■
クラスの中で関数ポインタ
1 名前: デフォルトの名無しさん 投稿日: 2001/03/08(木) 05:09
クラスの中の関数をクラスの中の関数ポインタで使いたいのですが、
エラーが出てきます。
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がクラスのメンバにアクセスできなくなってしまい困っています。
宜しくお願いします。


2 名前: デフォルトの名無しさん 投稿日: 2001/03/08(木) 06:56
教えてマイフレンド、深夜はどうしてこんな・・・
>>1
オレのお薦めはこれ、「スレ立てるまでも・・・」なんかに負けるな
http://piza.2ch.net/test/read.cgi?bbs=tech&key=980521175&ls=100

「void (__thiscall Classname::*)(void)」って言ってるんだから
void (classname::*func_pointer[3])(void);
でイイじゃんイイじゃん


3 名前: デフォルトの名無しさん 投稿日: 2001/03/08(木) 09:45
FAQ中のFAQやね。


4 名前: 1 投稿日: 2001/03/08(木) 13:34
ぐは〜、寝てた…。皆さんおはようさん。
親切な深夜の友2さん、ありがとう。今ちょっと試せないから後で試して報告するね。それじゃ。


5 名前: 1 投稿日: 2001/03/08(木) 14:43
1です。今試してみたところばっちりうまく通りました。
こんな記法しらなかったよ。まじサンクスっす。


6 名前: 1 投稿日: 2001/03/09(金) 05:31
続報です。
コンパイルは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++をよくわかってないのだと思いますが…


7 名前: 1 投稿日: 2001/03/09(金) 05:33
あ、書き忘れ。
init()のなかでstateは初期化されているとします。


8 名前: 1 投稿日: 2001/03/09(金) 05:41
またまた書き忘れ、もいっかい書き直します。スマソ…。

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;
}



9 名前: 2 投稿日: 2001/03/09(金) 07:26
なんてこった!意図がうまく伝わらなかったようだな。要するに、privateな
スレはみんなからアクセスできないから、こういう場合は( ゚Д゚)ギコに訊けと。
あるいはなんとかpublicにするか・・・、まいいか、どうでも

(*func_pointer[state])();を
(this->*func_pointer[state])();に


10 名前: 1 投稿日: 2001/03/10(土) 01:15
あちゃぁ、そういう意味だったのね。>2さん
今後は気をつけまっさ。

あと、thisポインタでうまく実行できま> あと、thisポインタでうまく実行できましたがもう一つ疑問がでてきました。
ギコ猫の方で質問しますんでまたよろしくお願いしますね。


11 名前: デフォルトの名無しさん 投稿日: 2001/03/10(土) 22:52
つーかなんで関数オブジェクトとか使わないのん?


12 名前: デフォルトの名無しさん 投稿日: 2001/03/11(日) 00:28
「クラスの間違った使い方」で出てきそうな例だね。



13 名前: デフォルトの名無しさん 投稿日: 2001/03/11(日) 00:54
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++使うな!)
からあえて使わないとか、そういう話は無いという仮定だけど。


14 名前: 12 投稿日: 2001/03/11(日) 09:23
C++ で関数ポインタを使うと、
13 さんの言う通りで、型チェックの恩恵を受けられないですよん。

まぁコールバック関数とか、APIでどうしても関数ポインタを
要求してるという場合はまた話が違いますけど。



15 名前: 13 投稿日: 2001/03/11(日) 23:50
こういう、C++わかってないCオンリーの人に、勉強時間与えないで
いきなり仕事させるのやめて欲しいよ〜。特に、設計だけはさせないで
欲しいよ〜。

Cオンリーの人のコードって、設計が物凄い事(Cルール的には普通かも
しれないけどC++ルール的には普通じゃないコード)になるので、ちょっと
修正ってわけにも逝かないんだよ〜。


16 名前: 12 投稿日: 2001/03/12(月) 01:41
何故あなたが12の名を語っているのか、私にはそれが不思議でならない。



17 名前: 12 投稿日: 2001/03/12(月) 01:42

は14へのレス。



18 名前: 11 投稿日: 2001/03/12(月) 10:41
>>12
ごめんまちがえた


19 名前: 11 投稿日: 2001/03/12(月) 10:44
あ、そういえばこのコードってひょっとして
ステートマシンとかオートマトンを作ろうとしてるの?

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