2

我正在尝试创建一个使用 Boost 套接字进行操作的类,以使连接易于使用。
我的SocketClient班级有一些属性,boost::asio::ip::tcp::socket其中之一。但是我的构造函数中出现C2512错误,因为boost::asio::ip::tcp::socket它没有构造函数,所以不能存在。
在这里,查看类的代码:

class SocketClient {
private:
    int port;    //Port, currently unused
    boost::asio::io_service io_service;  
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator;  
    boost::asio::ip::tcp::socket sock;  //This causes the error
    //It wants to be like this (impossible too):
  //boost::asio::ip::tcp::socket sock(io_service);
public:
    void init(const char*, const char* );
    SocketClient();  //Default constructor
    bool connect();
    bool read(int bytes, char *text);
    bool send(int length, char *text);
    bool send(std::string text);
    unsigned int timeout;
};

这是构造函数:

SocketClient::SocketClient() {  //ERROR: (23): error C2512: 'boost::asio::basic_stream_socket<Protocol>' : no appropriate default constructor available
    sock=boost::asio::ip::tcp::socket(io_service);  //Adding this didn't help
}

那么该怎么办?我必须保持sock原样void*吗?

4

4 回答 4

4

使用初始化列表

SocketClient::SocketClient() 
    :
    sock(io_service)
{
    // Other initialization code here...
}

不过要小心:这是明确定义的,因为成员变量是按照它们在类定义中出现的顺序构造的,并且io_service出现在 之前 sock。如果不是这种情况,您会将未初始化的对象传递给 的构造函数socket,这很可能会导致未定义的行为。

于 2013-03-14T21:35:10.627 回答
0

如果您使用的是 C++ 11,则可以这样做:

boost::asio::io_service io_service;  
boost::asio::ip::tcp::resolver::iterator endpoint_iterator;  
boost::asio::ip::tcp::socket sock { io_service };

但是(正如 Andy Prowl 所说)io_service 必须放在成员列表中的 sock 之前。

这将编译,但可能导致不可预知的错误:

boost::asio::ip::tcp::socket sock { io_service };
boost::asio::io_service io_service;
于 2014-09-29T15:54:33.007 回答
0

通常——如前所述——尽可能使用初始化列表。还使用标识成员的命名方案。

也已经说明 - 初始化取决于成员顺序。如果成员之间存在依赖关系,这通常是设计错误的标志。它闻起来臭臭的。至少在代码中很好地记录这一点 - 总会有下一个维护者。当然,您始终可以通过类型化(智能)指针来保存元素。

对于具体问题,我建议通过参考传递 io_service。这将使您对 io_service 有更多控制权(例如,使用异步模式并在一个 io_service 中运行多个套接字)

#include <boost/asio.hpp>

class SocketClient {
private:
    boost::asio::io_service& m_io_service;
    boost::asio::ip::tcp::socket m_socket;

[...]

public:
    SocketClient(boost::asio::io_service& io_service);

[...]

};


SocketClient::SocketClient(boost::asio::io_service& io_service)
    : m_io_service(io_service)
    , m_socket(io_service)
    [...]
{
}
于 2014-10-13T15:40:04.560 回答
0

头文件.h

boost::asio::ip::tcp::socket *sock;

正文.cpp

sock = new boost::asio::ip::tcp::socket(service);
于 2015-03-20T08:35:52.343 回答