我需要获得一个由标准函数指针调用的成员函数,因此我尝试抽象如下内容:
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系统调用,它需要一个函数指针和一个数据指针。我想将静态成员函数与此指针一起用作数据。
...而且我不希望类喜欢A
或B
具有静态成员。所以我的想法是创建一个像classSample
这样的接口,该接口由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);
}
指向成员函数(例如您的original void (Sample::*func)()
)的指针标识类中的函数,但不存储该对象。您仍然需要提供一个来调用该函数。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句