2011-03-20 59 views
1

當我嘗試訪問線程之外的向量時,出現鏈接錯誤。我的設計是,當我從客戶端收到消息時,我想讓按摩或數據進入我的數據隊列以便進一步操作。但我無法讓他們工作。這裏是我的代碼:問題:訪問線程內的向量

.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" ([email protected]@@[email protected][email protected]@[email protected]@@[email protected]@A) 

如果我沒有把靜態的說法,錯誤說:

error C2228: left of '.push_back' must have class/struct/union 

請幫助。

謝謝。

回答

3

我認爲問題在於,在C++中,在一個類中使用static數據成員是一個兩步過程。首先,你需要聲明變量static,表明它有一個名字和類型,然後你必須定義變量static給它在一個翻譯單元中的存儲空間。我的猜測是你已經完成了第一步,但沒有完成第二步。

要定義一個變量static,把一個定義,比如一進.cpp文件:

vector<char*> CUdpSocket::BuffStack1; 

注意,你不重複static關鍵字在這裏。相反,您只需提供static數據成員的類型和完全限定名稱。如果您想爲static數據成員使用非默認構造函數,那麼您也可以在此處執行此操作。

希望這會有所幫助!

PS。請不要使用標籤和goto s來實現您的循環...請使用while(true)循環! :-)

編輯:如果您打算從線程訪問這些vector,請確保您有適當的同步。在多線程中讀取和寫入vector是不安全的,但不能確保最多一個線程可以在任何時候修改它。

+0

我不能讓它們工作。你能告訴我怎麼樣? – 2011-03-20 11:39:51

+0

你能更具體嗎?你遇到了什麼錯誤?什麼特別是不工作? – templatetypedef 2011-03-20 18:15:48

+0

沒關係。我已經弄明白了。感謝您的幫助。 – 2011-03-22 04:54:24