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

解決


origi  2005-11-25 15:33:27  No: 59798  IP: 192.*.*.*

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

// 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-25 15:35:01  No: 59799  IP: 192.*.*.*

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

編集 削除
Blue  2005-11-25 15:39:47  No: 59800  IP: 192.*.*.*

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

編集 削除
YuO  2005-11-25 16:28:11  No: 59801  IP: 192.*.*.*

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

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

編集 削除
シャノン  2005-11-25 16:56:32  No: 59802  IP: 192.*.*.*

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

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

んで、

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

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

こんな感じで呼びます。

編集 削除
シャノン  2005-11-25 16:57:06  No: 59803  IP: 192.*.*.*

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

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

編集 削除
シャノン  2005-11-25 16:57:54  No: 59804  IP: 192.*.*.*

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

編集 削除
origi  2005-11-25 17:53:43  No: 59805  IP: 192.*.*.*

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

編集 削除