我需要获得一个由标准函数指针调用的成员函数,所以我尝试抽象这样的东西:
class Sample {
public:
virtual void doSomething(void) = 0;
};
class A : public Sample {
void doSomething(void); // details omitted
};
class B : public Sample {
void doSomething(void); // details omitted
};
class Executor {
public:
Executor(Sample *sample)
: func(&sample->doSomething)
{
}
static void *execute(void *data) {
Executor *pX = data;
(pX->*func)(); // error invalid access of func from static function
(pX->*pX->func)(); // error pointer to member type 'void (Sample::)()'
// incompatible with object type 'Executor'
}
private:
void (Sample::*func)(void);
};
int main(void) {
A myA;
B myB;
Executor x0(&myA);
Executor x1(&myB);
externallyInvoke(&Executor::execute, &x0);
externallyInvoke(&Executor::execute, &x1);
}
externalInvoke是一个Linux系统调用,它接受一个函数指针和一个数据指针.
我想使用静态成员函数和this-pointer作为数据.
……我不希望像A或B这样的类有静态成员.所以我的想法是创建一个类Sample的接口,它由A和B扩展.
我的问题是我不知道如何从Executor :: execute函数内部调用指向成员函数的指针.
最佳答案 问题是你需要在execute内部有两个对象 – 一个是Executor的实例,它将提供func,另一个是(一个派生自的类)的实例,将调用func.所以你必须将对象存储在Executor中,而不是函数:
class Executor {
public:
Executor(Sample *sample)
: obj(sample)
{
}
static void *execute(void *data) {
Executor *pX = static_cast<Executor*>(data);
pX->obj->doSomething();
}
private:
Sample *obj;
};
int main() { // note that `void main()` is not legal C++
A myA;
B myB;
Executor x0(&myA);
Executor x1(&myB);
externallyInvoke(&Executor::execute, &x0);
externallyInvoke(&Executor::execute, &x1);
}
指向成员函数的指针(例如您的原始void(Sample :: * func)())标识类中的函数,但不存储该对象.您仍然需要提供一个来调用该函数.