如何定义指向类成员函数的指针

时间:2022-08-30 09:43:23
我想定义一个函数指针,指向类成员函数的指针
我在网上查了下,之后我是这样写的 
   bool (CRecursion::*pfunDownFile)(CFileSystemTree*,wstring&);//定义函数指针
   pfunDownFile = &CRecursion::DownloadFile;

   CRecursion* pCRec = NULL;
   ((*pCRec).*(pfunDownFile))(*it,wstring(L"C:\\PhoneDown"));
   但运行时出现内存访问出错,因为 pCRec 的指针为0,    请问  如何定义指向类成员函数的指针!!!!

14 个解决方案

#1


下班了,明天再来看。

#2


你的类成员方法要是静态的,还有是stdcall的调用方式。

记得是这样的,下班了,没时间帮你试试。

#3


函数指针之类的好像比较麻烦,而且容易出错,具体的还是找点资料具体看看吧

#4


因为 pCRec 的指针为0,
试着new对象出来

#5


引用 4 楼 namelij 的回复:
因为 pCRec 的指针为0,
试着new对象出来

就是不想new 对象出来才想用函数指针的,我问我们的经理,他说,如果要用指向成员函数的函数指针的话,该成员必须是静态成员函数,这样的话就不能访问非静态的成员数据了。  我知道 如何定义和使用全局函数指针,但我要指向的这个函数是成员函数

#6


全局的指针指向成员函数很简单,但是你没法直接实现调用。

class A
{
public:
   void fun(){}
};
typedef void (A::* pfnAFun)();

pfnAfun ppfnAfun = &A::fun;
那你觉得你能在没有this指针的情况下使用ppfunAfun这个指针吗?

#7


对象没有初始化,你怎么调用成员函数呢?成员函数是对象的一部分。

#8


CRecursion* pCRec = NULL;
  ((*pCRec).*(pfunDownFile))(*it,wstring(L"C:\\PhoneDown"));
别的不说,这两句肯定是错误的,

#9


引用 5 楼 vbbianchengde 的回复:
引用 4 楼 namelij 的回复:

因为 pCRec 的指针为0,
试着new对象出来

就是不想new 对象出来才想用函数指针的,我问我们的经理,他说,如果要用指向成员函数的函数指针的话,该成员必须是静态成员函数,这样的话就不能访问非静态的成员数据了。 我知道 如何定义和使用全局函数指针,但我要指向的这个函数是成员函数

好像有点明白了,你要把这个函数和指针都声明为静态的,初始化指针的时候在类外用类名进行访问。调用的时候可以用类名,也可以用对象。

#10


引用 9 楼 tiannailu 的回复:
引用 5 楼 vbbianchengde 的回复:
引用 4 楼 namelij 的回复:

因为 pCRec 的指针为0,
试着new对象出来

就是不想new 对象出来才想用函数指针的,我问我们的经理,他说,如果要用指向成员函数的函数指针的话,该成员必须是静态成员函数,这样的话就不能访问非静态的成员数据了。 我知道 如何定义和使用全局函数指针,但我要指向的这个函数是成员函数

……

这样就成了静态成员函数了,直接调用ClassName::Fun  ,也不需要使用函数指针了

#11


引用 6 楼 bluesky12312388 的回复:
全局的指针指向成员函数很简单,但是你没法直接实现调用。

class A
{
public:
   void fun(){}
};
typedef void (A::* pfnAFun)();

pfnAfun ppfnAfun = &A::fun;
那你觉得你能在没有this指针的情况下使用ppfunAfun这个指针吗?


引用 7 楼 wangbishi22 的回复:
对象没有初始化,你怎么调用成员函数呢?成员函数是对象的一部分。


引用 8 楼 tiannailu 的回复:
CRecursion* pCRec = NULL;
  ((*pCRec).*(pfunDownFile))(*it,wstring(L"C:\\PhoneDown"));
别的不说,这两句肯定是错误的,

话是这样说, 但我今天的调用函数指针 能跑到函数里面去了, 我的代码是这样的
        bool (CRecursion::*pfunDownFile)(OBEX_File* ,CFileSystemTree* ,wstring&);//定义函数指针

pfunDownFile = &CRecursion::DownloadFile;
CRecursion* pCRec = NULL;

((*pCRec).*(pfunDownFile))(pObexFile,*it,wstring(L"C:\\PhoneDown"));//这里就进入了CRecursion::DownloadFile 这个函数
(话说代码贴得好乱,怎么贴可以整齐点)

#12


#13


感谢楼上提供的文章,但是看不太懂,以后有在遇到,再去翻看

#14


贴一个强调用类成员函数:

template<typename A,typename B>
void ChangeAddr(A& to,B from)
{
union 
{
A a;
B b;
}u;
u.b = from;
to = u.a;
}

class CTest
{
public:
void  fun()
{
printf("class CTest fun \n");
}
};
typedef  void   (__stdcall * FUNC)();

int main()
{
FUNC fun;
ChangeAddr(fun,&CTest::fun);//取得地址
fun();//执行函数 (因为没有对象,函数内若访问非静态成员,后果很严重!)
return 0;
}

#1


下班了,明天再来看。

#2


你的类成员方法要是静态的,还有是stdcall的调用方式。

记得是这样的,下班了,没时间帮你试试。

#3


函数指针之类的好像比较麻烦,而且容易出错,具体的还是找点资料具体看看吧

#4


因为 pCRec 的指针为0,
试着new对象出来

#5


引用 4 楼 namelij 的回复:
因为 pCRec 的指针为0,
试着new对象出来

就是不想new 对象出来才想用函数指针的,我问我们的经理,他说,如果要用指向成员函数的函数指针的话,该成员必须是静态成员函数,这样的话就不能访问非静态的成员数据了。  我知道 如何定义和使用全局函数指针,但我要指向的这个函数是成员函数

#6


全局的指针指向成员函数很简单,但是你没法直接实现调用。

class A
{
public:
   void fun(){}
};
typedef void (A::* pfnAFun)();

pfnAfun ppfnAfun = &A::fun;
那你觉得你能在没有this指针的情况下使用ppfunAfun这个指针吗?

#7


对象没有初始化,你怎么调用成员函数呢?成员函数是对象的一部分。

#8


CRecursion* pCRec = NULL;
  ((*pCRec).*(pfunDownFile))(*it,wstring(L"C:\\PhoneDown"));
别的不说,这两句肯定是错误的,

#9


引用 5 楼 vbbianchengde 的回复:
引用 4 楼 namelij 的回复:

因为 pCRec 的指针为0,
试着new对象出来

就是不想new 对象出来才想用函数指针的,我问我们的经理,他说,如果要用指向成员函数的函数指针的话,该成员必须是静态成员函数,这样的话就不能访问非静态的成员数据了。 我知道 如何定义和使用全局函数指针,但我要指向的这个函数是成员函数

好像有点明白了,你要把这个函数和指针都声明为静态的,初始化指针的时候在类外用类名进行访问。调用的时候可以用类名,也可以用对象。

#10


引用 9 楼 tiannailu 的回复:
引用 5 楼 vbbianchengde 的回复:
引用 4 楼 namelij 的回复:

因为 pCRec 的指针为0,
试着new对象出来

就是不想new 对象出来才想用函数指针的,我问我们的经理,他说,如果要用指向成员函数的函数指针的话,该成员必须是静态成员函数,这样的话就不能访问非静态的成员数据了。 我知道 如何定义和使用全局函数指针,但我要指向的这个函数是成员函数

……

这样就成了静态成员函数了,直接调用ClassName::Fun  ,也不需要使用函数指针了

#11


引用 6 楼 bluesky12312388 的回复:
全局的指针指向成员函数很简单,但是你没法直接实现调用。

class A
{
public:
   void fun(){}
};
typedef void (A::* pfnAFun)();

pfnAfun ppfnAfun = &amp;A::fun;
那你觉得你能在没有this指针的情况下使用ppfunAfun这个指针吗?


引用 7 楼 wangbishi22 的回复:
对象没有初始化,你怎么调用成员函数呢?成员函数是对象的一部分。


引用 8 楼 tiannailu 的回复:
CRecursion* pCRec = NULL;
  ((*pCRec).*(pfunDownFile))(*it,wstring(L"C:\\PhoneDown"));
别的不说,这两句肯定是错误的,

话是这样说, 但我今天的调用函数指针 能跑到函数里面去了, 我的代码是这样的
        bool (CRecursion::*pfunDownFile)(OBEX_File* ,CFileSystemTree* ,wstring&);//定义函数指针

pfunDownFile = &CRecursion::DownloadFile;
CRecursion* pCRec = NULL;

((*pCRec).*(pfunDownFile))(pObexFile,*it,wstring(L"C:\\PhoneDown"));//这里就进入了CRecursion::DownloadFile 这个函数
(话说代码贴得好乱,怎么贴可以整齐点)

#12


#13


感谢楼上提供的文章,但是看不太懂,以后有在遇到,再去翻看

#14


贴一个强调用类成员函数:

template<typename A,typename B>
void ChangeAddr(A& to,B from)
{
union 
{
A a;
B b;
}u;
u.b = from;
to = u.a;
}

class CTest
{
public:
void  fun()
{
printf("class CTest fun \n");
}
};
typedef  void   (__stdcall * FUNC)();

int main()
{
FUNC fun;
ChangeAddr(fun,&CTest::fun);//取得地址
fun();//执行函数 (因为没有对象,函数内若访问非静态成员,后果很严重!)
return 0;
}