我需要得到一个由标准函数指针调用的成员函数,所以我试着抽象成这样:
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);
}
externallyInvoke
是一个 Linux 系统调用,它接受一个函数指针和一个数据指针。
我想将静态成员函数与 this 指针一起用作数据。
...而且我不希望像 A
或 B
这样的类有静态成员。所以我的想法是创建一个类似于类 Sample
的接口(interface),它由 A
和 B
扩展。
我的问题是我不知道如何从 Executor::execute
函数内部调用指向成员函数的指针。
最佳答案
问题是您在 execute
中需要两个对象 - 一个是 Executor
的实例,它将提供 func
,另一个是Sample
的(派生类)实例,将在其上调用 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)()
)标识类中的函数,但不存储对象。您仍然需要提供一个来调用该函数。
关于c++ - 如何从静态成员函数调用指向成员函数的指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26604738/