(简单?)指向非静态成员函数的问题

时间:2011-08-26 00:22:51

标签: c++

请参阅下面的代码 - 我想知道如何编写A :: DoThisOrThat()

的主体,或者是否可能
class A
{
  void DoThis( void ) { // any function body you like... }
  void DoThat( void ) { // any function body you like... }

  void DoThisOrThat( const bool doThis );
};

void A::DoThisOrThat( const bool doThis )
{
    void (*pMemberFunction)( void );
    pMemberFunction = doThis? &A::DoThis : &A::DoThat;

    (*pMemberFunction)();    // member function invoked controlled by parameter
}

此函数的所有三行都可能需要重写以正确调整成员函数的范围。如上所述,我在第二行得到一个调用约定冲突,我指定了pMemberFunction。我无法解释清楚这一点的简单示例 - 所有示例都很容易找到一个成员变量来保存成员函数指针。我可以不只是创建一个局部变量来做同样的事情吗?

3 个答案:

答案 0 :(得分:7)

我可能会遗漏一些东西,但要做到这一点并不容易和简单吗?

void A::DoThisOrThat(bool doThis) 
{ 
    if(doThis) { DoThis(); }
    else       { DoThat(); }
}

假设您真的想要使用函数指针路由,请实现pointer to member functions are completely different beasts from pointers to non-member functions。它们不同的一种方式是您需要为函数提供一个对象来调用。语法如下:

void A::DoThisOrThat(bool doThis) 
{ 
    void (A::*pMemberFunction)();
    pMemberFunction = doThis ? &A::DoThis : &A::DoThat;
    (this->*pMemberFunction)();
} 

请注意,在声明指向成员函数的指针时,您还必须指定类(请注意A::*)和对象(请注意this->*)。还要记住,当形成指向成员的指针时,你必须完全限定函数名,即使在类中也是如此,并使用&符号(例如&A::DoThis,你已经正确完成了)。

答案 1 :(得分:7)

成员函数不是自由函数,指向成员函数的指针(PTMF)是不是函数指针!它们完全不兼容。 (通常它们要大得多。)更重要的是,如果同时具有PTMF 实例指针,则只能调用成员函数。

所以,你必须说:

void A::DoThisOrThat( const bool doThis )
{
    void (A::*pMemberFunction)( void );
    pMemberFunction = doThis? &A::DoThis : &A::DoThat;

    (this->*pMemberFunction)();
}

(如果您想要的只是在一个本地条件上进行分支,那么就没有任何理由需要这么多的间接。)

答案 2 :(得分:1)

替换这些:

void (*pMemberFunction)( void );
(*pMemberFunction)();    // member function invoked controlled by parameter

使用:

void (A::*pMemberFunction)( void );
(*this->pMemberFunction)();    // member function invoked controlled by parameter