2013-01-16 60 views
0

我是使用win32 API的新手,所以請耐心等待。實現涉及窗口的拷貝構造函數HANDLE對象

我目前正在研究一個涉及Winsock的C++項目,但是我對使用事件對象HANDLE類型關於複製構造函數的正確方法感到困惑。

概述(代碼如下):在嘗試使用IOCP並保持所有內容可伸縮時,我有一個線程來檢查多個接受事件。每個ServerConnection對象都擁有由WSACreateEvent(),其關聯的低級套接字以及相關的狀態/變量創建的自己的接受事件對象。

我的問題是,我試圖實現「三大」,我不太清楚應該如何「複製」句柄。

DuplicateHandle()似乎創建了一個新的句柄,但它指向同一個對象,但這對於ServerConnection「copy」來說沒有任何意義(我們想要一個只有相同狀態的新對象,對吧? )。

至於使用複製賦值操作符,我不確定它會爲事件對象HANDLEs做什麼。

ServerConnection.h

class ServerConnection 
{ 
public: 
    //...constructors, destructors, etc... 

    virtual HANDLE getAcceptEvent(); 

    virtual void setAcceptEvent(HANDLE eventObj); 

protected: 

private: 

    HANDLE assocAcceptEvent; 

    //..other variables... 
}; 

ServerConnection.cpp

ServerConnection::ServerConnection(ServerConnection &that) 
{ 
    //blah blah...other vars 

    //? This does not seem right as the HANDLE is logically a pointer; 
    //Assigning like this just points another handle to the same event obj 
    //If the other ServerConnection object closes the handle...not good. 
    this.assocAcceptEvent = that.assocAcceptEvent; 

    //The only thing that make slightly more sense, is just to create a whole new one 
    //if I answered my own question, then great...but I wanted to make sure 
    this.assocAcceptEvent = WSACreateEvent(); 

    //assume check for WSACreateEvent failing with WSAGetLastError() and 
    //handle appropriately 
} 
+1

通常答案是通過不允許副本來處理副本。在C++ 11中將其標記爲'= delete',並且在C++ 03中將其設爲私有而沒有實現。 –

+1

正如其他人所說,該對象不應該是可複製的。這是包裝OS資源的對象的常見選擇(如標準中的'fstreams')。你可以在C++ 11中做的事情是讓它移動,這是有道理的。 – ybungalobill

回答

4

,你不能複製手柄以合理的方式(這是事實,該DuplicateHandle不會做什麼你想)讓我覺得這個對象不應該是可複製的...

你要問自己的問題是: ServerConnection的副本實際上是什麼意思? 你在哪裏/如何使用它?

我不知道答案,因爲我不知道你的整體設計是如何處理ServerConnection - 但事實上它說服務器連接使我認爲它是「連接」到某物,因此不能簡單地複製。

+0

你是完全正確的,如果你想讓你可以共享訪問權限,但不能複製實際的套接字。 –