我是使用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
}
通常答案是通過不允許副本來處理副本。在C++ 11中將其標記爲'= delete',並且在C++ 03中將其設爲私有而沒有實現。 –
正如其他人所說,該對象不應該是可複製的。這是包裝OS資源的對象的常見選擇(如標準中的'fstreams')。你可以在C++ 11中做的事情是讓它移動,這是有道理的。 – ybungalobill