boost :: bind:来自被调用的函数,不能改变对象的状态

时间:2014-06-02 08:26:41

标签: c++ boost boost-asio

class foo {
   public:
        int bar;
        void _quux(boost::system::error_code ec)
        {
           std::cout << "quux:" << ++bar << std::endl;
        }
        boost::system::error_code connect(const boost::asio::ip::tcp::endpoint& endpoint)
        {
            std::cout << "bar:" << bar << std::endl;
            if(!bar) {
                _socket.async_connect(endpoint, 
                    boost::bind(&foo::_quux, this,
                        boost::asio::placeholders::error));
                return boost::asio::error::would_block;
            }
        }
        tcp::socket _socket;
}

为什么barconnect()内保持0,即使它在_quux中变为1(它始终为0-> 1,因此状态丢失)?

1 个答案:

答案 0 :(得分:1)

我没有看到问题(除了奇怪的使用硬编码的error_code之外)

在这里观看:

#include <boost/asio.hpp>

using tcp = boost::asio::ip::tcp;

#include <iostream>
#include <boost/bind.hpp>

class foo {
   public:
        int bar;
        void _quux(boost::system::error_code ec)
        {
           std::cout << "quux:" << ++bar << std::endl;
        }
        boost::system::error_code connect(const boost::asio::ip::tcp::endpoint& endpoint)
        {
            std::cout << "bar:" << bar << std::endl;

            if(!bar) {
                _socket.async_connect(endpoint, boost::bind(&foo::_quux, this, boost::asio::placeholders::error));
                return boost::asio::error::would_block;
            }

            return {};
        }
        tcp::socket _socket;
};

int main()
{
    boost::asio::io_service svc;
    foo f { 0, tcp::socket { svc } };

    tcp::endpoint ep(boost::asio::ip::address_v4::loopback(), 6767);
    f.connect(ep);

    svc.run();
}

打印:

bar:0
quux:1

如果您错误地期望值会随着foo而改变,那么这显然是错误的期望:_async表示 asycnronous 执行。从本质上讲,该值将在更新后更新 ,而不是更早。