我试图在不同的类中声明和调用函数指针,但在编译时遇到错误。 请参阅以下代码。 注意:这不是实际的代码,而只是具有修改的变量和函数名称的实际代码的一部分。
档案A.h
typedef bool (A::*add_ptr_Typ)(int a,int b );
class A
{
public:
bool add_func(int a,int b );
void m_assign();
add_ptr_Typ add_ptr;
}
文件A.cpp
void A::m_assign()
{
add_ptr = & A::add_func;
}
bool A::add_func(int a,int b )
{
if ((a+b) > 10)
return true;
else
return false;
}
文件B.h
class B
{
public:
add_ptr_Typ m_add_ptr;
bool m_process(A* A_ptr);
}
档案B.cpp
bool B::m_process(A* A_ptr)
{
m_add_ptr = A_ptr->add_ptr;
(m_add_ptr)(2,3); //error:must use â.*â or â->*â to call pointer-to-member function
(*m_add_ptr)(2,3);//error: invalid use of âunary *â on pointer to member
(this->m_add_ptr)(2,3);//error: must use â.*â or â->*â to call pointer-to-member function
this->m_add_ptr(2,3);//error: pointer to member type bool (A::)(int,int) incompatible with object type B
}
我尝试以我知道的所有可能方式调用函数指针(我不知道它们中的一些或全部是错误的)。 我在编译时将错误信息作为注释放在该行前面。
答案 0 :(得分:4)
你没有处理函数指针,你正在处理指向成员函数的指针。这些是非常不同的野兽。将后者视为“对象中函数的标识符”。您必须将它与对象一起使用才能获得可调用的内容。换句话说,这个:
bool B::m_process(A* A_ptr)
{
m_add_ptr = A_ptr->add_ptr;
(A_ptr->*m_add_ptr)(2, 3);
}
->*
(和相应的.*
)是解除引用指向成员的运算符。