:
void A::SetCallback(void (B::*callback)(int))
{
}
void B::test()
{
a->SetCallback(&B::Done); //
}
void B::Done(int i)
{
..........................
}
しかし、クラスのメソッドを呼び出すために、あなたがそのメソッドを呼び出すためのオブジェクトが必要です次のコードを使用してください。それはかなりありませんが、C++ 03を求めて:
#include <iostream>
#include <vector>
#include <functional>
class AbstractCallback {
public:
virtual void call(int arg) = 0;
};
template <class T>
class Callback : public AbstractCallback {
public:
typedef std::mem_fun1_t<void, T, int> CallbackFunc;
private:
CallbackFunc func;
T* object;
public:
Callback(T* _object, const CallbackFunc& _func)
: object(_object), func(_func) {
}
void call(int arg) {
func(object, arg);
}
};
struct A {
void foo(int a) {
std::cout << "foo " << a << std::endl;
}
};
struct B {
void bar(int a) {
std::cout << "bar " << a << std::endl;
}
};
int main() {
A a;
B b;
AbstractCallback* cbs[2] = {
new Callback<A>(&a, std::mem_fun(&A::foo)),
new Callback<B>(&b, std::mem_fun(&B::bar)),
};
cbs[0]->call(10);
cbs[1]->call(22);
delete cbs[0];
delete cbs[1];
return 0;
}
あなたはへのポインタ(タイプA::*
とB::*
の)メンバ関数を見ることができるようにするために生成されstd::mem_fun
sおよびCallback
クラスにラップされています各タイプ(この場合はA
とB
)。
これにより、任意の型のメソッドをベクトル、配列または抽象コールバックのリストに保持できます。
'SetCallback'は空き関数へのポインタをとります。クラスメソッドへのポインタは、オブジェクトへのポインタを暗黙的にパラメータとして取るため、異なっています。 – user463035818
もしあなたがそれを取ることができたら、 'A ::'で 'B :: Done'と呼ぶでしょうか? – Holt