Using boost::asio::io_service as class member field

青春壹個敷衍的年華 提交于 2019-12-02 07:03:16

问题


I have class where I use boost asio library:

Header:

class TestIOService {

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

private:
    TestIOService(std::string address);
    std::string address;
    // boost::asio::io_service service;
};

Impl:

#include <boost/asio/ip/address.hpp>
#include <boost/asio/ip/udp.hpp>
#include "TestIOService.h"

void TestIOService::makeConnection() {
    boost::asio::io_service service;
    boost::asio::ip::udp::socket socket(service);
    boost::asio::ip::udp::endpoint endpoint(boost::asio::ip::address::from_string("192.168.1.2"), 1234);
    socket.connect(endpoint);
    socket.close();
}

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

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

And main:

int main(void)
{
    TestIOService service = TestIOService::getInst();
    service.makeConnection();
}

When I have service defined in makeConnection method with this line:

boost::asio::io_service service;

there is no problem, but when I have it as class field member(commented out in code) I get this error:

note: ‘TestIOService::TestIOService(TestIOService&&)’ is implicitly deleted because the default definition would be ill-formed: class TestIOService {


回答1:


io_service is not copyable.

You can make it shared quickly by wrapping it in shared_ptr<io_service>, but you should really reconsider the design first.

If your class needs to be copyable, it would logically not contain the io_service object

E.g. the following sample does create two instances of the test class not sharing a connection:

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();
}


来源:https://stackoverflow.com/questions/29623652/using-boostasioio-service-as-class-member-field

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!