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);
}
通りすがりのものですが
virtualfunc = (int (*)(int,int))p;
でいかがでしょうか。
> C++でvoid型のポインタから関数のポインタにキャストしたいのですが、
キャストに使う型は,単純に変数の宣言から識別子を抜いた物です。つまり
> int (*virtualfunc)(int a,int b);
↓
(int (*)(int, int))
でもって,C++だと,
> virtualfunc=p; //ここでwarningが出てしまいます。本来ならばcastすべき???
これは文法違反ですからエラーが出ると思いますが……。
#VC++5では「新しい動作」とあるので,それ以前のコンパイラでは警告なのかもしれま
せんが。
void *を他の型に代入する場合は常にキャストする必要があります。
こんな感じでやってみては?
自分の場合は大体こんな感じですが。
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);
}
いろいろなアドバイスありがとうございます。
おかげさまで問題解決しました。
本当にご親切にありがとうございましたm(_ _)m
ところで、ちょっと伺いたいのですが、ご返答いただいたかたがたは
一体どのような本でC++を勉強したのでしょうか?
もし問題ないようでしたら教えてください。
(またはお勧めの本を教えてください)
#今私は独習C++で勉強中なのですが、質問を解決できるようなこと
が記載されていませんでした。
よろしくお願いします。
え~っと,キャスト関連は「プログラミング言語C第二版」で,
void*への代入の問題は「プログラミング言語C++第三版」で勉強しました。
#後者は勉強した,というより知ったですな……。
> ところで、ちょっと伺いたいのですが、ご返答いただいたかたがたは
> 一体どのような本でC++を勉強したのでしょうか?
すいません、わすれちゃいました。
ヘルプ
+ MSDN ライブラリ
+ Visual C++ ドキュメント
+ リファレンス
+ C/C++ 言語および C++ ライブラリ
+ C ランゲージ リファレンス
+ 宣言と型
+ 宣言子と変数宣言
+ より複雑な宣言子の解釈
は必読です。
double ( *var( double (*)[3] ) )[3];
という例などもありますよ。(^ ^;