キャストされたオブジェクトのメンバ関数へのポインタをvoid*
から呼び出すのが難しいです。たとえば以下を参照してください。静的メソッドからメンバ関数へのポインタを呼び出すことができません
class Test
{
public:
Test(int pointTo)
{
if (pointTo == 1)
function = &Test::Function1;
else
function = &Test::Function2;
}
static void CallIt(void* cStyle)
{
Test* t(static_cast<Test*>(cStyle));
(t->*function)();// error C2568: '->*': unable to resolve function overload
}
void CallIt()
{
(this->*function)();// Works just fine
}
private:
typedef void (Test::*ptrToMemberFunc)();
ptrToMemberFunc function;
void Function1()
{
std::cout << "Function 1" << std::endl;
}
void Function2()
{
std::cout << "Function 2" << std::endl;
}
};
int main()
{
Test t1(1);
Test t2(2);
Test::CallIt(static_cast<void*>(&t1));
Test::CallIt(static_cast<void*>(&t2));
t1.CallIt();
t2.CallIt();
return 0;
}
オブジェクトがvoid*
とバックにキャストされた場合どうなりますか?なぜ、私はもはやメンバ関数へのポインタを呼び出すことができないのですか?
EDIT:次のように
がCallIt()
を変更するには、プログラムをコンパイルすることができますが、私はまだ元が機能しなかった理由として興味があります。
static void CallIt(void* cStyle)
{
Test* t(static_cast<Test*>(cStyle));
Test::ptrToMemberFunc pf(t->function);
(t->*pf)();
}
私はちょうどダウンidentificatiorsに、wandboxでまったく同じコードを書いたこと面白いです。 Tuple_catの答えはこれを説明しています。基本的には、オブジェクトと呼び出し可能オブジェクトをリンクする必要があるため、間接演算子では不十分です。コンパイラの中には、このような静的なメンバのみを呼び出すことができることを伝えるような、より理解しやすいエラーメッセージがあります。 – Swift
編集に関しては、 > * 'あなたを捨てている。それはオブジェクトとメンバ関数へのポインタを取った 'call_with_this'という名前の通常の関数だと考えてください。そして、あなたの元の働かないコールは 'call_with_this(t、function);'でした。ここで、 'function'という名前は' Test'クラスの非静的メンバーですが、 't'とは何の関係もありません。静的な関数なので、 '関数'という名前を解決するためには 'this'は表示されません。 't-> function'を要求すると、実際の値にアクセス可能な名前があります。 – GManNickG
@GManNickGそれはまさにそれです。今、私は解決策を見ていますが、私はそれを得ていますが、 ' - > *演算子が実際に何をしているのか分かりませんでした(私は'(t->(* function)) ')。 – Kerry