急!请问如何将线程函数声明为类的友元函数

时间:2022-09-08 08:59:44
我希望在线程函数中能访问类的私有成员变量,因此想把线程函数声明的类的友元,部分代码如下:
我在A.h中声明了一个线程函数,在A.cpp中实现此线程函数
A.h
 
unsigned  _stdcall  dataSendThread(void* param);  //线程函数

然后在CClient.h中有一个类CClient
class CClient
{
    public:
         void startRunning();
         friend  unsigned  _stdcall  dataSendThread(void* param); //将线程函数声明为类CClient的友元
};

CClient.cpp中
void CClient::startRunning()
{
     _beginthreadex(NULL, 0, dataSendThread, (void*)this, 0, &sendThreadID);
}

在编译时报如下的错误:

error LNK2019: 无法解析的外部符号 "unsigned int __stdcall dataRecvThread(void *)" (?dataRecvThread@@YGIPAX@Z),该符号在函数 "public: bool __thiscall CClient::startRunning(void)" (?startRunning@CClient@@QAE_NXZ) 中被引用

10 个解决方案

#1


怎么是dataRecvThread?..........
直接把CClient类的成员写在一个结构体里,地址传给线程函数,然后就不用友元了。

#2


定义呢。。。定义呢

#3


用static成员函数多好啊?

#4


好像是得用static成员

#5


可以把线程函数,写成类的静态函数:

class CClient
{
public:
    static unsigned _stdcall dataSendThread(void* param); //线程函数
     void ThreadFunc();// 真正的线程函数,想访问成员,就访问哪个成员
public:
    startRunning();
};

void CClient::startRunning()
{
    _beginthreadex(NULL, 0, dataSendThread, (void*)this, 0, &sendThreadID);
}

unsigned _stdcall CClient::dataSendThread(void* param)
{
    static_cast<CClient*>(param)->ThreadFunc();
}

#6


线程函数应该是静态的,否则创建线城时找不到入口地址

#7


线程函数可以传入一个参数,你可以将你的类对象指针传进去。在函数里面再将它转换成实际对象的类型

#8


同意5楼的做法

建议去看看 侯捷翻译的《win32多线程程序设计》一书

#9


我用原来的那种方法,将线程函数声明为CClient的友元函数也能完成功能,不过还是谢谢各位了,还有就是5楼的方法,线程函数中能改变类中的非static成员的值吗

#10


线程函数需要写成全局的   需要加上static

#1


怎么是dataRecvThread?..........
直接把CClient类的成员写在一个结构体里,地址传给线程函数,然后就不用友元了。

#2


定义呢。。。定义呢

#3


用static成员函数多好啊?

#4


好像是得用static成员

#5


可以把线程函数,写成类的静态函数:

class CClient
{
public:
    static unsigned _stdcall dataSendThread(void* param); //线程函数
     void ThreadFunc();// 真正的线程函数,想访问成员,就访问哪个成员
public:
    startRunning();
};

void CClient::startRunning()
{
    _beginthreadex(NULL, 0, dataSendThread, (void*)this, 0, &sendThreadID);
}

unsigned _stdcall CClient::dataSendThread(void* param)
{
    static_cast<CClient*>(param)->ThreadFunc();
}

#6


线程函数应该是静态的,否则创建线城时找不到入口地址

#7


线程函数可以传入一个参数,你可以将你的类对象指针传进去。在函数里面再将它转换成实际对象的类型

#8


同意5楼的做法

建议去看看 侯捷翻译的《win32多线程程序设计》一书

#9


我用原来的那种方法,将线程函数声明为CClient的友元函数也能完成功能,不过还是谢谢各位了,还有就是5楼的方法,线程函数中能改变类中的非static成员的值吗

#10


线程函数需要写成全局的   需要加上static