我在网上查了下,之后我是这样写的
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对象出来
试着new对象出来
#5
就是不想new 对象出来才想用函数指针的,我问我们的经理,他说,如果要用指向成员函数的函数指针的话,该成员必须是静态成员函数,这样的话就不能访问非静态的成员数据了。 我知道 如何定义和使用全局函数指针,但我要指向的这个函数是成员函数
#6
全局的指针指向成员函数很简单,但是你没法直接实现调用。
class A
{
public:
void fun(){}
};
typedef void (A::* pfnAFun)();
pfnAfun ppfnAfun = &A::fun;
那你觉得你能在没有this指针的情况下使用ppfunAfun这个指针吗?
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"));
别的不说,这两句肯定是错误的,
((*pCRec).*(pfunDownFile))(*it,wstring(L"C:\\PhoneDown"));
别的不说,这两句肯定是错误的,
#9
好像有点明白了,你要把这个函数和指针都声明为静态的,初始化指针的时候在类外用类名进行访问。调用的时候可以用类名,也可以用对象。
#10
这样就成了静态成员函数了,直接调用ClassName::Fun ,也不需要使用函数指针了
#11
话是这样说, 但我今天的调用函数指针 能跑到函数里面去了, 我的代码是这样的
bool (CRecursion::*pfunDownFile)(OBEX_File* ,CFileSystemTree* ,wstring&);//定义函数指针
pfunDownFile = &CRecursion::DownloadFile;
CRecursion* pCRec = NULL;
((*pCRec).*(pfunDownFile))(pObexFile,*it,wstring(L"C:\\PhoneDown"));//这里就进入了CRecursion::DownloadFile 这个函数
(话说代码贴得好乱,怎么贴可以整齐点)
#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对象出来
试着new对象出来
#5
就是不想new 对象出来才想用函数指针的,我问我们的经理,他说,如果要用指向成员函数的函数指针的话,该成员必须是静态成员函数,这样的话就不能访问非静态的成员数据了。 我知道 如何定义和使用全局函数指针,但我要指向的这个函数是成员函数
#6
全局的指针指向成员函数很简单,但是你没法直接实现调用。
class A
{
public:
void fun(){}
};
typedef void (A::* pfnAFun)();
pfnAfun ppfnAfun = &A::fun;
那你觉得你能在没有this指针的情况下使用ppfunAfun这个指针吗?
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"));
别的不说,这两句肯定是错误的,
((*pCRec).*(pfunDownFile))(*it,wstring(L"C:\\PhoneDown"));
别的不说,这两句肯定是错误的,
#9
好像有点明白了,你要把这个函数和指针都声明为静态的,初始化指针的时候在类外用类名进行访问。调用的时候可以用类名,也可以用对象。
#10
这样就成了静态成员函数了,直接调用ClassName::Fun ,也不需要使用函数指针了
#11
话是这样说, 但我今天的调用函数指针 能跑到函数里面去了, 我的代码是这样的
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;
}