在标题所示的页码里例15-12中:
HANDLE hThread=CreateThread(NULL,0,RecvProc,......);
中的RecvProc如果定义为ChatDlg的成员函数,如例15-13,在编译是怎么会出错呢?
我不能理解,我的理解是:HANDLE hThread=CreateThread(NULL,0,RecvProc,......);是在ChatDlg类的成员函数OninitDialog
成员函数里调用的啊,应该可以调用本类的成员函数RecvProc的啊,请高手指点下。
小弟献上30分
HANDLE hThread=CreateThread(NULL,0,RecvProc,......);
中的RecvProc如果定义为ChatDlg的成员函数,如例15-13,在编译是怎么会出错呢?
我不能理解,我的理解是:HANDLE hThread=CreateThread(NULL,0,RecvProc,......);是在ChatDlg类的成员函数OninitDialog
成员函数里调用的啊,应该可以调用本类的成员函数RecvProc的啊,请高手指点下。
小弟献上30分
成员函数里调用的啊,应该可以调用本类的成员函数RecvProc(也是CChatDlg的成员函数)的啊
目的只有一个,就是需要在编译期能分配上内存,以确保在创建线程时成功回调其线程函数!(
首先楼主要清楚几点
1 在c++中类的非静态成员函数都有一个隐含的this指针,正是因为这个this指针使得普通的非静态成员函数无法作为一个callback(回调)函数来使用。至于为什么无法作为一个回调函数,请看第二点。
2 好了,问题就是出在这个隐含的this指针上,callback函数是给windows回调使用的,windows在用的到这个回调函数的时候会不借助任何对象调用这个函数,也就没有为这个函数传递this指针,你如果非要给这个createthread函数传递一个非静态成员函数,那么这个函数肯定会有一个隐含的this指针。但是在函数调用的时候,由于这种系统规定的callback函数调用机制使得它不可能为这个函数准备一个参数,这样函数调用堆栈中的参数个数少了一个,结果当然会使程序崩溃了!
3 所以啊,楼主不弄混了,在类的成员函数里当然可以调用类的另一个成员函数,只是让它作为一个回调函数是有大问题的,除非将它声明为静态的成员函数,这样编译器就会将这个this指针去掉,也就适合作为一个回调函数了。
不知道楼主看懂了没有,有问题 加我Q895262587
而类中的静态函数是属于某一个类,而不是某一个对象,里面没有隐含的this指针
按照9楼的说法,那回调函数的默认参数堆栈里就没有接收this指针的那一块了,我想知道
HANDLE hThread=CreateThread(NULL,0,RecvProc,......)里的RecvProc规定好了是回调函数吗?
我查了MSDN,好象里面也没怎么说啊