学习1

来源:互联网 发布:淘宝退货纸条怎么写图 编辑:程序博客网 时间:2024/05/21 08:35

类的成员函数引用时.和->的使用是根据这两个操作符前面的操作数的不同确定的。
类的对象引用成员函数或数据成员时(统称成员)使用.操作符
类的对象的指针引用成员时,使用->操作符

 

 

===================================

 

我头文件写的是:
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这样使用
================================================================
原创粉丝点击