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

标签 c++ pointers pointer-to-member

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

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 指针一起用作数据。

...而且我不希望像 AB 这样的类有静态成员。所以我的想法是创建一个类似于类 Sample 的接口(interface),它由 AB 扩展。

我的问题是我不知道如何从 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/

相关文章:

c++ - 如何在 C++ 正则表达式中匹配带有左大括号 { 的字符串

c++ - 如何打开 icc/icpc 警告?

c++ - 类成员 vector 上的迭代器未正确取消引用

c++ - 如何将结构内的所有内容设置为 0?

c++ - 如何获得指向类的复制构造函数的成员函数指针?

c - 为什么在函数中使用字符串参数时退出程序后我的变量损坏(运行时检查失败)

c++ - 将 char 数组转换为对象指针 - 这是 UB 吗?

c++ - 按降序对这些元素进行排序?

c++ - 为什么指向从基到派生的成员转换的指​​针会出错

c++ - 如何在基类中存储和执行派生类成员函数