为什么enable_shared_from_this必须公开继承?

时间:2016-07-13 15:48:25

标签: c++ c++11 shared-ptr

我很难理解为什么这个代码会抛出。 SO上的所有其他解决方案都说你需要有一个shared_ptr实例才能使用shared_from_this(),我就拥有了它! 但尽管如此,代码仍然像所有其他问题所描述的那样崩溃。

以下是代码的简化版本

的main.cpp

// doesn't work

MultiTcpInOut.h

uint16_t port = 9876;
auto inout = cms::MultiTcpInOut::create(port);
inout->start_accept();

MultiTcpInOut.cpp

#ifndef MULTITCPINOUT_H
#define MULTITCPINOUT_H

#include <memory>
#include <utility>

namespace cms {

    using namespace std;

    class MultiTcpInOut : private enable_shared_from_this<MultiTcpInOut>
    {
        public:
            static shared_ptr<MultiTcpInOut> create(uint16_t port)
            {
                return shared_ptr<MultiTcpInOut>(new MultiTcpInOut(port));
            }

            virtual ~MultiTcpInOut();

            // start_accept() can not be called from the constructor because it uses shared_from_this(), and
            // make_shared<>() haven't finished yet when it is called. Let the instantiating code call it
            void start_accept();

        protected:
            MultiTcpInOut(uint16_t port);
    };
}
#endif // MULTITCPINOUT_H

void MultiTcpInOut::start_accept() { LOG(INFO) << "Starting accept"; auto socket = make_shared<tcp::socket>(io_service); auto shrd_this = shared_from_this(); acceptor->async_accept(*socket.get(), bind(&MultiTcpInOut::handle_accept, shrd_this, socket, std::placeholders::_1)); } 更改为private enable_shared_from_this<MultiTcpInOut>解决了问题。

它说它必须公开继承(at least reading the reference),我不明白它为什么没有,因为我是从类方法中调用它的!

那么,为什么必须公开呢? 它是如此清晰,以至于规范中没有提到它?

帮助可能遇到同样问题的人

ENABLE_SHARED_FROM_THIS必须作为公众进行宣传!!!

1 个答案:

答案 0 :(得分:1)

这是来自cppreference:'对于enable_shared_from_这是一个常见的(直到C ++ 17)标准(自C ++ 17开始)实现是为此保存弱引用(例如std :: weak_ptr)。 std :: shared_ptr的构造函数检测到enable_shared_from_this base的存在,并将新创建的std :: shared_ptr分配给内部存储的弱引用。也就是说,std::shared_ptr<>需要对此字段的写访问权限,而不仅仅是您的类。