構造体の関数・仮想関数のエラー

解決


origi  2005-11-26 00:33:27  No: 59798

どうしても分からないので・・・。
ある構造体に関数を持たせ、そのアドレスを別の構造体のポインタに入れようとしているのですが、
なぜか " '&':仮想関数のアドレスを取ろうとしました。"
と表示されてしまいます。
簡単に説明するとこうです。

// 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です


origi  2005-11-26 00:35:01  No: 59799

すいません。
Visual Studio .NET の Visual C++  です。変に入れてしまいました。
お願いします。


Blue  2005-11-26 00:39:47  No: 59800

関数の呼び出し方が違います。
http://www.microsoft.com/japan/developer/library/vccore/_core_calling_conventions_tasks.htm


YuO  2005-11-26 01:28:11  No: 59801

メンバ関数へのポインタは,
std::string (AA::*pf)(const char *);
のように定義し,
pf = &AA::Str;
のように取得します。

ポインタの定義やポインタの取得方法からわかるように,
通常の関数へのポインタと,メンバ関数へのポインタは全く異なります。


シャノン  2005-11-26 01:56:32  No: 59802

かつ、メンバ関数のポインタを使ってメンバ関数を呼び出すときは、そのクラスなり構造体なりのインスタンスが必要になります。

> メンバ関数へのポインタは,
> std::string (AA::*pf)(const char *);
> のように定義し,
> pf = &AA::Str;
> のように取得します。

んで、

AA aa;
std::string ret = (aa.*pf)();

AA * paa = &aa;
ret = (paa->*pf)();

こんな感じで呼びます。


シャノン  2005-11-26 01:57:06  No: 59803

> こんな感じで呼びます。

ごめん、引数渡すの忘れてた。


シャノン  2005-11-26 01:57:54  No: 59804

メンバ関数が static ならば、普通の C 言語の関数と同じように扱えます。


origi  2005-11-26 02:53:43  No: 59805

みなさん、できました。
まだ知識が薄いと再認識しました。お恥ずかしいです・・。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加