C++类的成员函数访问与类的强制类型转换相关的问题

tendollor 2014-03-18 12:48:18

我看到一种写法 觉得很奇怪 不理解其原理 请大家点评一下


//================================
//Processor.h
class Processor
{
//......
//.....

public:
static UINT __stdcall foo_process_wrapper(LPVOID param);
private:
void foo_process(LPVOID param);

}
extern Processor Proc;
//=============================



//=========================
//Processor.cpp

UINT __stdcall Processor::foo_process_wrapper(LPVOID param)
{
((Processor *)param)->foo_process( (my_param_type *)param );
}



Processor Proc;
//===========================






然后再某地方使用这个类

//================================
//test.cpp

#include "Processor.h"

int main()
{
int Threadaddr;
HANDLE m_handle;
char * buf = "test";
m_handle=(HANDLE)_beginthreadex

(NULL,256000,Proc.foo_process_wrapper,(LPVOID)

buf,0,&Threadaddr);


}
//================================



这样一来线程成功执行foo_process里的代码,建立多个线程也正常没有冲突



而我理解的Processor::foo_process_wrapper中的param参数理应是 传入的buf 他被转换成my_pargam_type也就是char*之后也能正常得到值

为什么可以用((Processor *)param)->foo_process这种方式访问成员函数呢

我再试过直接Processor * Ptest;
然后直接用(Processor *)Ptest->foo_process 程序是会出现内存访问错误崩溃的.

具体是什么个原理 和__stdcall的foo_process_wrapper压入栈的参数有关吗
然后我又测试了下 应该个__stdcall压入栈的参数没关 都自动处理过了

之前内存访问错误是因为指针没有分配内存空间

那么我随便给个空间就好了于是我定义了一个char* Ptest="test";
这样就有内存空间了,然后再强制转换(Processor *)Ptest->foo_process 就一切执行正常

是否是只要任何内容非空的可访问指针 都可以转换成Processor类型并访问类成员? 这其中的原理是什么?到底如何转换的?



...全文
314 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tendollor 2014-03-19
  • 打赏
  • 举报
回复
看来已经没人感兴趣了..还是结贴吧..
tendollor 2014-03-18
  • 打赏
  • 举报
回复
测试后用任意有效指针强转 的方法都可以正常访问成员函数,但是成员函数中不能访问成员变量,而如果用类的全局变量proc去访问成员函数,最终在成员函数中是可以访问成员变量的,但成员的对象只初始化了一个,理论上不管是否多线程都会同时访问到同样的成员变量,这里这个类的成员变量就可以作为这种方式创建线程的全局变量与共享变量来用了....然后就是注意线程同步等事情了, 应该是之前写这个的写法有点绕..假如参数传进来的是this指针 应该就是可以访问成员变量的吧? 猜测他原本的目的应该是这样的,而实际用proc全局变量更方便 还能把参数变量空出来真正的传参数..
我达威 2014-03-18
  • 打赏
  • 举报
回复
引用 4 楼 wmzadw 的回复:
矫情,哥来围观
嗯说的不错
我达威 2014-03-18
  • 打赏
  • 举报
回复
矫情,哥来围观
feihuadao 2014-03-18
  • 打赏
  • 举报
回复
成员函数不跟对象关联,下面这句话编译通过,只要函数里面没有涉及到成员变量就能正确执行。

((Processor *)0)->foo_process;
tendollor 2014-03-18
  • 打赏
  • 举报
回复
引用 1 楼 akirya 的回复:
((Processor *)param)->foo_process这是先强转,然后再调用.param的值是一个有效的 对象的地址,.
Processor * Ptest;
(Processor *)Ptest->foo_process
Ptest是一个无效的地址,这么调用肯定崩溃了
你好,谢谢你的回答,这里的错误我是明白的,所以我进行了随便分配东西的测试..发现正常..程序崩溃并不让我困扰,程序正常执行才是困扰我的地方..
  • 打赏
  • 举报
回复
((Processor *)param)->foo_process这是先强转,然后再调用.param的值是一个有效的 对象的地址,.
Processor * Ptest;
(Processor *)Ptest->foo_process
Ptest是一个无效的地址,这么调用肯定崩溃了

64,649

社区成员

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

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