関数ポインタへのキャスト

[戻る]
しん [E-Mail] 2002/07/09(火) 18:28:50
C++でvoid型のポインタから関数のポインタにキャストしたいのですが、
どのようにすればよいのでしょうか?
もしわかる方がいましたらぜひともご教授お願いします。

こんな感じ(ちょっと違うけど)でやりたいのです。。。
(例)
int add(int a,int b){
  return (a+b);
};

int (*virtualfunc)(int a,int b);

void main(){
 void *p;
 int a,b,c;
 a=1;
 b=3;
 p=(void*)add;  
 virtualfunc=p; //ここでwarningが出てしまいます。本来ならばcastすべき???
 c=virtulafunc(a,b);
}

山本八郎 2002/07/09(火) 19:06:30
通りすがりのものですが

virtualfunc = (int (*)(int,int))p;

でいかがでしょうか。

YuO [E-Mail] 2002/07/09(火) 20:08:15
> C++でvoid型のポインタから関数のポインタにキャストしたいのですが、

キャストに使う型は,単純に変数の宣言から識別子を抜いた物です。つまり

> int (*virtualfunc)(int a,int b);
↓
(int (*)(int, int))


でもって,C++だと,
>  virtualfunc=p; //ここでwarningが出てしまいます。本来ならばcastすべき???
これは文法違反ですからエラーが出ると思いますが……。
#VC++5では「新しい動作」とあるので,それ以前のコンパイラでは警告なのかもしれま
せんが。

void *を他の型に代入する場合は常にキャストする必要があります。

[E-Mail] 2002/07/09(火) 20:09:20
こんな感じでやってみては?
自分の場合は大体こんな感じですが。

int add(int a,int b){
  return (a+b);
};

typedef int (*virtualfunc_t)(int a,int b);
virtualfunc_t virtualfunc ;

void main(){
 virtualfunc_t p;
 int a,b,c;
 a=1;
 b=3;
 p=add;
 virtualfunc=p;
 c=virtulafunc(a,b);
}

しん [E-Mail] 2002/07/09(火) 20:51:24
[[解決]]
いろいろなアドバイスありがとうございます。
おかげさまで問題解決しました。
本当にご親切にありがとうございましたm(_ _)m

ところで、ちょっと伺いたいのですが、ご返答いただいたかたがたは
一体どのような本でC++を勉強したのでしょうか?
もし問題ないようでしたら教えてください。
(またはお勧めの本を教えてください)
#今私は独習C++で勉強中なのですが、質問を解決できるようなこと
が記載されていませんでした。

よろしくお願いします。

YuO [E-Mail] 2002/07/10(水) 02:28:39
え〜っと,キャスト関連は「プログラミング言語C第二版」で,
void*への代入の問題は「プログラミング言語C++第三版」で勉強しました。
#後者は勉強した,というより知ったですな……。

[E-Mail] 2002/07/10(水) 08:58:03
> ところで、ちょっと伺いたいのですが、ご返答いただいたかたがたは
> 一体どのような本でC++を勉強したのでしょうか?

すいません、わすれちゃいました。

山本八郎 2002/07/10(水) 09:43:17
ヘルプ
+ MSDN ライブラリ
  + Visual C++ ドキュメント
    + リファレンス
      + C/C++ 言語および C++ ライブラリ
        + C ランゲージ リファレンス
          + 宣言と型
            + 宣言子と変数宣言
              + より複雑な宣言子の解釈

は必読です。

double ( *var( double (*)[3] ) )[3];

という例などもありますよ。(^ ^;

古いスレッドには追加発言できません。