我是c ++的新手。我想知道对象指针和指向成员函数的指针。我写了一段代码:
代码:
#include <iostream>
using namespace std;
class golu
{
int i;
public:
void man()
{
cout<<"\ntry to learn \n";
}
};
int main()
{
golu m, *n;
void golu:: *t =&golu::man(); //making pointer to member function
n=&m;//confused is it object pointer
n->*t();
}
但是当我编译它时,它显示了两个错误:
pcc.cpp: In function ‘int main()’:
pcc.cpp:15: error: cannot declare pointer to ‘void’ member
pcc.cpp:15: error: cannot call member function ‘void golu::man()’ without object
pcc.cpp:18: error: ‘t’ cannot be used as a function.
我的问题如下:
请解释一下这些概念。
答案 0 :(得分:8)
此处纠正了两个错误:
int main()
{
golu m, *n;
void (golu::*t)() =&golu::man;
n=&m;
(n->*t)();
}
n->*t();
; (n->*(t()))
被解释为(n->*t)()
醇>
答案 1 :(得分:4)
成员函数指针具有以下形式:
R (C::*Name)(Args...)
R
是返回类型,C
是类类型,Args...
是函数的任何可能参数(或者没有)。
有了这些知识,你的指针应如下所示:
void (golu::*t)() = &golu::man;
注意成员函数后缺少()
。那会尝试调用刚刚获得的成员函数指针,如果没有对象则不可能
现在,使用简单的typedef可以获得更多可读性:
typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;
最后,您不需要指向对象的指针来使用成员函数,但您需要括号:
golu m;
typedef void (golu::*golu_memfun)();
golu_memfun t = &golu::man;
(m.*t)();
括号很重要,因为()
运算符(函数调用)具有比.*
(和->*
)运算符更高的优先级(也称为precedence)。 / p>
答案 2 :(得分:2)
'void golu :: * t =&amp; golu :: man();'应改为'void(golu :: * t)()=&amp; golu :: man;'你试图使用指针函数而不是指向静态函数结果的指针!
答案 3 :(得分:1)
(1)未正确声明函数指针。
(2)你应该这样声明:
void (golu::*t) () = &golu::man;
(3)成员函数指针应与class
的对象一起使用。