请参阅下面的代码 - 我想知道如何编写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。我无法解释清楚这一点的简单示例 - 所有示例都很容易找到一个成员变量来保存成员函数指针。我可以不只是创建一个局部变量来做同样的事情吗?
答案 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