类的成员函数引用时.和->的使用是根据这两个操作符前面的操作数的不同确定的。
类的对象引用成员函数或数据成员时(统称成员)使用.操作符
类的对象的指针引用成员时,使用->操作符
===================================
我头文件写的是:
protected:
// 处理完成端口的消息的线程函数
DWORD WINAPI WorkerThread(LPVOID);
.cpp使用的时候,是:
m_WorkProcId[i]=CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&CnetserverDlg::WorkerThread,CompletionPort, 0, &dwThreadId);
可是它报错,说是;
error C2440: “类型转换”: 无法从“DWORD (__stdcall CnetserverDlg::* )(LPVOID)”转换为“LPTHREAD_START_ROUTINE”
请问这个原因是什么啊?
-------------------------------------------
(LPTHREAD_START_ROUTINE)CnetserverDlg::WorkerThread
-------------------------------------------
函数名本身就代表一个地址,所以&符号去掉,另外,线程函数必须是全局函数或是静态成员函数
-------------------------------------------
线程函数必须是全局函数或者静态成员函数
-------------------------------------------
因为线程函数要是全局函数或静态成员函数。
静态成员函数只能访问静态成员变量。
--------------------------------------------
友元也用了,,发现还是无法访问,例子如下:
// 开始监听的线程函数
void WINAPI ListenProc();
// 处理完成端口的消息的线程函数
DWORD WINAPI WorkerThread(LPVOID);
class CnetserverDlg : public CDialog
{
// 构造
public:
friend void WINAPI ListenProc();
friend DWORD WINAPI WorkerThread(LPVOID);
private:
//完成端口
HANDLE CompletionPort;
// 服务器SOCKET
SOCKET m_serverSocket;
}
void WINAPI ListenProc()
{
// 临时客户端的SOCKET
SOCKET sClient;
int iaddrSize = sizeof(SOCKADDR_IN);
PPER_IO_DATA lpPerIOData;
while (TRUE)
{
sClient = accept(m_serverSocket, (struct sockaddr *)&sClient, &iaddrSize);//<----这里报错: error C2065: “m_serverSocket”: 未声明的标识符
}
--------------------------------------------
写两个函数,
一个是全局的线程入口函数, 如DWORD WINAPI ThreadEntry(LPVOID p);
一个是真正的线程处理函数, 而且是你的类的成员函数, 如CYourClass::DoThread(...);
将ThreadEntry做为CreateThread(...)的参数, 将CYourClass指针做为ThreadEntry(...)的参数, 并在ThreadEntry中调用CYourClass::DoThread。
-------------------------------------------
友元也应该使用类来引用。
比如, 将void WINAPI ListenProc() 改为void WINAPI ListenProc(CnetserverDlg* pDlg);
然后再在ListenProc函数体中这样引用:
- C/C++ code
-
pDlg->m_serverSocket;
================================================================error c2228的一种说法:如果.y前的类对象是指针对象,或者.y前的对象未定义就会出现这样的问题。
.y前的类对象是指针对象要->y这样使用================================================================