当我尝试访问线程外的向量时出现链接错误。我的设计是,当我从客户端收到消息时,我希望按摩或数据在我的数据队列中以便进一步操作。但我无法让他们工作。这是我的代码:
.cpp文件:
// Inside the recv thread
start:
err = recvfrom(RecvSocket, lpData->RecvBuf, BufLen, 0, (SOCKADDR *)&lpData->SenderAddr, &SenderAddrSize);
//lpData is used to access Recv Structure which stores the attributes of the server and client.
switch(lpData->port)
{
case 6516:
{
BuffStack1.push_back(lpData->RecvBuf);
break;
}
case 6517:
{
break;
}
case 6518:
{
break;
}
}
goto start;
.h文件:
class CUdpSocket
{
public:
CUdpSocket(void);
~CUdpSocket(void);
void ServerRecv(int port);
void ClientSend(const char *ip, int port, const char *buff);
unsigned static __stdcall ServerRecvThread(void *arguments);
unsigned static __stdcall ClientSendThread(void *arguments);
CString static Itoa(int data);
void Mix();
private:
RecvStruct *pRecvData;
SendStruct *pSendData;
vector<HANDLE>threadStl;
static vector<char*>BuffStack1; // Here is my stack vector
static vector<char*>BuffStack2;
static vector<char*>BuffStack3;
HANDLE hThread;
unsigned threadID;
static BufferData *ptrBufferData;
};
我是否需要放置静态有点困惑。当我放静态时,错误将是:
error LNK2001: unresolved external symbol "private: static class std::vector<char *,class std::allocator<char *> > CUdpSocket::BuffStack1" (?BuffStack1@CUdpSocket@@0V?$vector@PADV?$allocator@PAD@std@@@std@@A)
如果我没有放静态语句,错误说:
error C2228: left of '.push_back' must have class/struct/union
请帮忙。
谢谢。
答案 0 :(得分:3)
我认为问题在于,在C ++中,在类中使用static
数据成员是一个两步过程。首先,你需要声明 static
变量,表明它有一个名称和类型,然后你必须定义 static
变量到在其中一个翻译单元中给它存储空间。我的猜测是你已经完成了第一步而不是第二步。
要定义static
变量,请将类似这样的定义放入.cpp文件中:
vector<char*> CUdpSocket::BuffStack1;
请注意,您在此处不重复static
关键字。相反,您只需提供static
数据成员的类型和完全限定名称。如果要为static
数据成员使用非默认构造函数,也可以在此处执行此操作。
希望这有帮助!
PS。请不要使用标签和goto
来实现循环...请改用while(true)
循环! : - )
编辑:如果您要从该主题访问这些vector
,请确保您已进行适当的同步。从多个线程读取和写入vector
是不安全的,而不确保最多一个线程可以在任何时候修改它。