如何从静态成员函数调用指向成员函数的指针?

2024-01-16

我需要获得一个由标准函数指针调用的成员函数,所以我尝试抽象这样的东西:

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(使用前将#替换为@)

如何从静态成员函数调用指向成员函数的指针? 的相关文章

随机推荐