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

C++类的成员函数访问与类的强制类型转换相关的问题
本帖最后由 tendollor 于 2014-03-18 12:52:32 编辑

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


//================================
//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类型并访问类成员? 这其中的原理是什么?到底如何转换的? 




------解决方案--------------------
((Processor *)param)->foo_process这是先强转,然后再调用.param的值是一个有效的 对象的地址,.

Processor * Ptest;
(Processor *)Ptest->foo_process
 Ptest是一个无效的地址,这么调用肯定崩溃了
------解决方案--------------------
成员函数不跟对象关联,下面这句话编译通过,只要函数里面没有涉及到成员变量就能正确执行。

((Processor *)0)->foo_process;