どうしても分からないので・・・。
ある構造体に関数を持たせ、そのアドレスを別の構造体のポインタに入れようとしているのですが、
なぜか " '&':仮想関数のアドレスを取ろうとしました。"
と表示されてしまいます。
簡単に説明するとこうです。
// AA.h
struct AA
{
std::string Str(const char*);
}
// BB.h
typedef std::string (*FUNC)(const char*);
struct BB
{
FUNC func;
}
// main.h
typedef std::string (*FUNC)(const char*);
main()
{
AA aa;
BB bb;
bb.func = &aa.Str;//ここにエラー
return;
}
Visual.NETです
すいません。
Visual Studio .NET の Visual C++ です。変に入れてしまいました。
お願いします。
関数の呼び出し方が違います。
http://www.microsoft.com/japan/developer/library/vccore/_core_calling_conventions_tasks.htm
メンバ関数へのポインタは,
std::string (AA::*pf)(const char *);
のように定義し,
pf = &AA::Str;
のように取得します。
ポインタの定義やポインタの取得方法からわかるように,
通常の関数へのポインタと,メンバ関数へのポインタは全く異なります。
かつ、メンバ関数のポインタを使ってメンバ関数を呼び出すときは、そのクラスなり構造体なりのインスタンスが必要になります。
> メンバ関数へのポインタは,
> std::string (AA::*pf)(const char *);
> のように定義し,
> pf = &AA::Str;
> のように取得します。
んで、
AA aa;
std::string ret = (aa.*pf)();
AA * paa = &aa;
ret = (paa->*pf)();
こんな感じで呼びます。
> こんな感じで呼びます。
ごめん、引数渡すの忘れてた。
メンバ関数が static ならば、普通の C 言語の関数と同じように扱えます。
みなさん、できました。
まだ知識が薄いと再認識しました。お恥ずかしいです・・。
ありがとうございました。
ツイート | ![]() |