C++ 将不透明指针包装在共享\u ptr中

C++ 将不透明指针包装在共享\u ptr中,c++,std,shared-ptr,winsock2,C++,Std,Shared Ptr,Winsock2,我正在尝试使用winsock2实现一个简单的TCP服务器应用程序。为此,我有一个接受连接的类(TcpServer)和一个处理连接的类(TcpListener)。为此,这些对象需要共享SOCKET,whis被定义为UINT\u PTR。要安全地分享这一点,一个shared\u ptr似乎是最好的选择。不幸的是,shared\u ptr似乎应该包装一个struct或class,因此我的实现如下 struct SafeSocket_ { SOCKET Socket; SafeSocke

我正在尝试使用winsock2实现一个简单的TCP服务器应用程序。为此,我有一个接受连接的类(
TcpServer
)和一个处理连接的类(
TcpListener
)。为此,这些对象需要共享
SOCKET
,whis被定义为
UINT\u PTR
。要安全地分享这一点,一个
shared\u ptr
似乎是最好的选择。不幸的是,
shared\u ptr
似乎应该包装一个
struct
class
,因此我的实现如下

struct SafeSocket_
{
    SOCKET Socket;
    SafeSocket_(SOCKET socket)
        : Socket(socket)
    {}
    ~SafeSocket_()
    {
        closesocket(Socket);
        std::cout << "destroyed SafeSocket_" << std::endl;
    }
};
typedef std::shared_ptr<SafeSocket_> SafeSocket;
除了使用一个好的包装器库之外,一定有更好的方法来处理这个问题


<> >注意:我知道有一些很好的包装库,比如Assio,是Boost,但是我只是想弄清楚一些C++基础知识。

< P>基本的问题是<代码> uTuntPtR <代码>不是一个不透明指针。这是一个整数。如果是
typedef struct\uuu socket
,然后您可以编写
std::shared_ptr
,插入一个自定义的deleter来调用close_socket,这样您就会笑了

有许多可能的方法:

  • 使
    SafeSocket
    成为包含共享ptr的类,并具有
    socket
    成员函数。然后到处写
    ClientSocket.socket()
  • 如上所述,但给出套接字函数的
    SafeSocket
    版本,并提供实际的套接字参数。因此,您可以编写
    ClientSocket.read(…)
    而不是
    read(ClientSocket.Socket,…)
  • 作为typedef恢复到
    SafeSocket
    ,但将附加函数放在
    SafeSocket\uu
    中,这样您就可以编写
    ClientSocket->read(…)

我想我更喜欢中间的解决方案。

基本问题是
UINT\u PTR
不是不透明的指针。这是一个整数。如果是
typedef struct\uuu socket
,然后您可以编写
std::shared_ptr
,插入一个自定义的deleter来调用close_socket,这样您就会笑了

有许多可能的方法:

  • 使
    SafeSocket
    成为包含共享ptr的类,并具有
    socket
    成员函数。然后到处写
    ClientSocket.socket()
  • 如上所述,但给出套接字函数的
    SafeSocket
    版本,并提供实际的套接字参数。因此,您可以编写
    ClientSocket.read(…)
    而不是
    read(ClientSocket.Socket,…)
  • 作为typedef恢复到
    SafeSocket
    ,但将附加函数放在
    SafeSocket\uu
    中,这样您就可以编写
    ClientSocket->read(…)

我想我更喜欢中间的解决方案。

天哪!经过三次编辑,几乎完全正确!可以使用自定义的
删除器
,该删除器将
套接字
定义为
指针
类型,即使它实际上不是指针。不确定是否可以使用
std::shared_ptr
执行相同的操作,尽管它也支持自定义
Deleter
,但可能支持自定义指针,也可能不支持自定义指针?我还没有深入研究它,我选择了中间的解决方案。雷米的建议很好,但我现在意识到将资源号包装在指针容器中会令人困惑。天哪!经过三次编辑,几乎完全正确!可以使用自定义的
删除器
,该删除器将
套接字
定义为
指针
类型,即使它实际上不是指针。不确定是否可以使用
std::shared_ptr
执行相同的操作,尽管它也支持自定义
Deleter
,但可能支持自定义指针,也可能不支持自定义指针?我还没有深入研究它,我选择了中间的解决方案。Remy的建议会很好,但我现在意识到将资源号包装在指针容器中会令人困惑。
SafeSocket ClientSocket = SafeSocket(new SafeSocket_(accept(ListenSocket, NULL, NULL)));