为什么相应成员无法正确访问成员函数指针?

时间:2018-07-13 18:24:44

标签: c++ function-pointers

请考虑以下代码段。

class B {
public:
    void up() {
        std::cout << "up" << std::endl;
    }
    void down() {
        std::cout << "down" << std::endl;
    }
    void init( void(B::*someFunc)() , void(B::*otherFunc)() ) {
        m_execute = someFunc;
        B* newB = new B();
        m_b = newB;
        m_b->m_execute = otherFunc;
    }

    void find() {
        (this->*m_execute)();
        (m_b->*m_execute)();
    }
private:
    void(B::*m_execute)();
    B* m_b;
};

int main(){
    B* b = new B();
    b->init(&B::up,&B::down);
    b->find();
}

我有一个类B。它的私有成员是指向B的指针,即m_b和一个函数指针。 在init()函数中,给私有成员函数指针up(),给私有成员m_b函数指针down() 当我运行代码时,B :: up()被执行两次,而不是先执行B :: up()然后执行B :: down()。

1 个答案:

答案 0 :(得分:5)

发生这种情况是因为您将一个对象的m_execute应用于另一个对象。

通过更改此行来解决此问题

(m_b->*m_execute)();
//     ^^^^^^^^^
// Points to your m_execute, not m_b's

对此:

(m_b->*m_b->m_execute)();

更好的是,添加一个成员函数来运行自己的execute,然后从B::find进行调用:

void find() {
    run_my_execute();
    m_b->run_my_execute();
}
void run_my_execute() {
    (this->*m_execute)();
}

这将避免将谁的指针应用于哪个对象的困惑。

Demo.