【C++】関数ポインタの使い方
関数ポインタの使い方で悩んでいます。
下記の
(1)のようにグローバルメソッドとして定義したメソッドを関数ポインタに代入することは出来るのですが、
(2)のようにクラスのメンバメソッドとして定義したメソッドは関数ポインタに代入することは出来ませんでした。
Error:バインドされた関数へのポインターは関数の呼び出しにのみ使用できます。
というエラーが発生します。
関数ポインタに外部参照でメソッドを代入することは出来ないのでしょうか?
-----(1)------------------------------------------------------------------
#include "stdafx.h"
#include <iostream>
using namespace std;
int f(int a, int b){
return a * b;
}
int _tmain(int argc, _TCHAR* argv[])
{
typedef int (* FUNC_POINTER)(int, int);
FUNC_POINTER fp;
fp = f;
cout << fp(1,2) <<endl;
getchar();
return 0;
}
-------------------------------------------------------------------------
-----(2)------------------------------------------------------------------
#include "stdafx.h"
#include <iostream>
using namespace std;
class MPointerList{
public:
int f(int a, int b){
return a * b;
}
};
int _tmain(int argc, _TCHAR* argv[])
{
typedef int (* FUNC_POINTER)(int, int);
FUNC_POINTER fp;
//fp = f;
MPointerList mP;
fp = mP.f;
cout << fp(1,2) <<endl;
getchar();
return 0;
}
-------------------------------------------------------------------------
お礼
とんでもない誤解をしていまして申し訳ありません。 argv[1] の格納されている番地と、"yes" が格納され ている番地が 違う事にどうして気がつかなかったのか 反省しています。 おかげで良く分かるようになりました。 どうもありがとうございました。
補足
早速のご教示ありがとうございます。 どうやらとんでもない迷路に入り込んでいたようですが、一つ疑問があります。 >argv[1]が指すアドレスと >"yes"文字列のアドレスは >当然異なりますので の部分が良く分かりません。 char *p = argv[1]; cout << "argv[1] は " << &p << " です。" << endl; cout << "argv[1] の中身は " << *(&p) << " です。" << endl; の3行を追加して結果を見ますと良く分からなくなってきます。 そこで、アドレス(本来、0x43fb00a3 というような表現のもの)と ”yes"(アスキーコードに変換したとしても 0x43fb00a3 とはことなることがはっきりしていると思いますが)とを比較していた、だから等しくない、ということになったという解釈なら分かりやすいのですが、、、、。 つまり 本来、0x43fb00a3 というようなアドレスを cout で表示させる時に、アドレスそのものではなく、アドレスの中身を表示するようになっているということなのでしょうか? 言い替えますと、アドレスを表示しなさい、とすれば 0x43fb00a3 のように表示されるのならすんなりと理解できるのですが、そうではなく、アドレスそのものを表示させるためには、あるいは、アドレスそのものとして取り扱うようにするためには & 演算子を冠しないとダメだと言う事、そのような仕様になっていると言う事なのでしょうか? 長くなってしまいましたがどうぞよろしくお願いします。