C++类的成员函数访问与类的强制类型转换相关的有关问题
C++类的成员函数访问与类的强制类型转换相关的问题
我看到一种写法 觉得很奇怪 不理解其原理 请大家点评一下
然后再某地方使用这个类
这样一来线程成功执行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.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;Ptest是一个无效的地址,这么调用肯定崩溃了
(Processor *)Ptest->foo_process
------解决方案--------------------
成员函数不跟对象关联,下面这句话编译通过,只要函数里面没有涉及到成员变量就能正确执行。
((Processor *)0)->foo_process;