使用 boost::asio::io_service 作为类成员字段

Joe*_*Joe 3 c++ boost boost-asio

我有一个使用 boost asio 库的课程:

\n\n

标题:

\n\n
class TestIOService {\n\npublic:\n    void makeConnection();\n    static TestIOService getInst();\n\nprivate:\n    TestIOService(std::string address);\n    std::string address;\n    // boost::asio::io_service service;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

实现:

\n\n
#include <boost/asio/ip/address.hpp>\n#include <boost/asio/ip/udp.hpp>\n#include "TestIOService.h"\n\nvoid TestIOService::makeConnection() {\n    boost::asio::io_service service;\n    boost::asio::ip::udp::socket socket(service);\n    boost::asio::ip::udp::endpoint endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 1234);\n    socket.connect(endpoint);\n    socket.close();\n}\n\nTestIOService::TestIOService(std::string address) : address(address) { }\n\nTestIOService TestIOService::getInst() {\n    return TestIOService("192.168.1.2");\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

以及主要:

\n\n
int main(void)\n{\n    TestIOService service = TestIOService::getInst();\n    service.makeConnection();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我使用以下行在 makeConnection 方法中定义服务时:

\n\n
boost::asio::io_service service;\n
Run Code Online (Sandbox Code Playgroud)\n\n

没有问题,但是当我将它作为类字段成员(在代码中注释掉)时,我收到此错误:

\n\n
\n

注意: \xe2\x80\x98TestIOService::TestIOService(TestIOService&&)\xe2\x80\x99 被隐式删除\n,因为默认定义格式不正确:\n class TestIOService {

\n
\n

seh*_*ehe 5

io_service是不可复制的。

您可以通过将其包装在 中来快速共享它shared_ptr<io_service>,但您应该首先重新考虑设计。

如果您的类需要可复制,那么逻辑上它不会包含io_service对象

例如,以下示例确实创建了两个不共享连接的测试类实例:

Live On Coliru

#include <boost/asio.hpp>
#include <boost/make_shared.hpp>
#include <iostream>

class TestIOService {

public:
    void makeConnection();
    static TestIOService getInst();

private:
    TestIOService(std::string address);
    std::string address;

    boost::shared_ptr<boost::asio::ip::udp::socket> socket;
    boost::shared_ptr<boost::asio::io_service> service;
};

void TestIOService::makeConnection() {
    using namespace boost::asio;
    service = boost::make_shared<io_service>();
    socket  = boost::make_shared<ip::udp::socket>(*service);
    socket->connect({ip::address::from_string("192.168.1.2"), 1234 });
    //socket->close();
}

TestIOService::TestIOService(std::string address) 
    : address(address) { }

TestIOService TestIOService::getInst() {
    return TestIOService("192.168.1.2");
}

int main() {
    auto test1 = TestIOService::getInst();
    auto test2 = TestIOService::getInst();
}
Run Code Online (Sandbox Code Playgroud)