如何将类成员函数指针赋给 一个函数指针

redhumor 2010-06-12 01:12:38
没办法 写了个C++要用 C语言的函数
比如 class A
{
public: void test();
}
int main()
{

pthread_create(tid,这个位置需要传一个void*的函数指针);
}
我一开始用 &A::test传进去的时候 系统提示 不能将 void* (A::*)() 转换为 void* (*)();
我该怎么办?
...全文
246 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
redhumor 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 mskmc_mc 的回复:]

typedef void * (A::* PF )();
pthread_create(tid,PF)
改一下不就OK了吗
[/Quote]
兄弟 看下 楼上 罪恶的代码 你就知道了 呵呵 我是学习了
mskmc_mc 2010-06-12
  • 打赏
  • 举报
回复
typedef void * (A::* PF )();
pthread_create(tid,PF)
改一下不就OK了吗
liutengfeigo 2010-06-12
  • 打赏
  • 举报
回复

//lthyxy: 果然很罪恶的代码,张见识了~
机智的呆呆 2010-06-12
  • 打赏
  • 举报
回复
vc10通过,代码仅供参考~~~代码本身写的比较罪恶~~

#include <iostream>
using namespace std;

class A
{
public:
int i;
void test()
{
cout<<"test"<<endl;
cout<<i<<endl;
}
A():i(11111){}
};
void pthread_create(A* a,void(*p)())
{
int thisPtr=(int)a;
__asm{mov ecx, thisPtr}
p();
}
void Test()
{
cout<<"Test"<<endl;
}
int main()
{
A a;
void (A::* Afcn)()=&A::test;
pthread_create(&a,(void(*)())*(int*)&Afcn);
pthread_create(0,Test);
return 0;

}


如果pthread_create是以API的方式提供,也就是无法修改pthread_create代码的话,那么lz从设计上来讲
是不妥,因为一旦pthread_create对成员函数指针没有进行相应的处理,那么即使成功传人成员函数指针值也是
不正确的,因为成员函数调用时需要和一个对象绑定的。
太乙 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 redhumor 的回复:]
引用 12 楼 hqin6 的回复:
有两种方式做这个事情:
1、最简单的,将你的类成员函数声明为static。
2、使用全局函数
3、使用全局函数,将对象的this指针作为参数传给这个函数,然后在里面转换一下,使用类成员函数

额 除了static方法 和全局函数 就没出路了?……诶 纠结呢 呵呵
[/Quote]这样说吧,你的函数,需要让pthread_create“看到”,明白?
redhumor 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 hqin6 的回复:]
有两种方式做这个事情:
1、最简单的,将你的类成员函数声明为static。
2、使用全局函数
3、使用全局函数,将对象的this指针作为参数传给这个函数,然后在里面转换一下,使用类成员函数
[/Quote]
额 除了static方法 和全局函数 就没出路了?……诶 纠结呢 呵呵
liutengfeigo 2010-06-12
  • 打赏
  • 举报
回复
~!~
太乙 2010-06-12
  • 打赏
  • 举报
回复

有两种方式做这个事情:
1、最简单的,将你的类成员函数声明为static。
2、使用全局函数
3、使用全局函数,将对象的this指针作为参数传给这个函数,然后在里面转换一下,使用类成员函数
qiubolecn 2010-06-12
  • 打赏
  • 举报
回复
类的成员函数,默认带了一个this指针。
selooloo 2010-06-12
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;

class A
{
public: void test() {cout<<"test"<<endl;}
};
typedef void (A::* Afcn)();
void pthread_create(A& a,Afcn pa=&A::test)
{
(a.*pa)();
}

int main()
{
A a;
pthread_create(a);
getchar();
return 0;

}
liutengfeigo 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 taodm 的回复:]

呃,我是理解你的意思啊,问题是你不肯看书补基础哈。
[/Quote]
幽默的大牛
jcwKyl 2010-06-12
  • 打赏
  • 举报
回复
你试着把A::test()换成static的函数,再试试看。
taodm 2010-06-12
  • 打赏
  • 举报
回复
呃,我是理解你的意思啊,问题是你不肯看书补基础哈。
redhumor 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]

楼主找本基础教材补课“指向成员的指针”
[/Quote]
额 不知是否是你没理解我的 意思额…… 我可以调用函数指针 但是 函数指针地址类型 却存在问题啊 不像C语言 ,函数地址是void*型 而C++是和类相关的 好像不能去掉类型?
redhumor 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lthyxy 的回复:]

void (a::*)() = &A::test
pthread_create(tid,a)
[/Quote]
不可以哦 pthread_create(tid,(void*)(*start)(*void));这是第二个参数的完整形式,用楼上的方法 得到的 也是错误提示:不能将 void (A::*) 转换为void (void*)
liutengfeigo 2010-06-12
  • 打赏
  • 举报
回复
void (A::*a)() = &A::test
pthread_create(tid,a)
liutengfeigo 2010-06-12
  • 打赏
  • 举报
回复
void (a::*)() = &A::test
pthread_create(tid,a)
tan625747 2010-06-12
  • 打赏
  • 举报
回复
class A
{
public: void * test();
}
int main()
{

A a;
pthread_create(tid, a.test);
}

这样不知可否
taodm 2010-06-12
  • 打赏
  • 举报
回复
楼主找本基础教材补课“指向成员的指针”

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧