我需要获得一个由标准函数指针调用的成员函数,所以我尝试抽象这样的东西:
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
or B
拥有静态成员。所以我的想法是创建一个类似类的接口Sample
,延长了A
and B
.
我的问题是我不知道如何从内部调用指向成员函数的指针Executor::execute
功能。
问题是你需要里面有两个对象execute
- 一个是实例Executor
这将供应func
,另一个是(派生自的类)的实例Sample
其上func
将被调用。所以你必须存储物体 inside 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)()
) 标识类中的函数,但不存储对象。您仍然需要提供一个来调用该函数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)