繁体   English   中英

在构造函数中初始化Boost shared_ptr

[英]Initialize Boost shared_ptr in constructor

我有一个类,它有一个boost::asio::io_service对象。 我希望这个对象存储在boost::shared_ptr

所以我的标题看起来像这样(我摆脱了任何不必要的代码,所以它不会分散注意力)

class CommandDispatcher
{
private:
    boost::shared_ptr<boost::asio::io_service> m_ioservice;
public:
    CommandDispatcher();
};

当我现在创建CommandDispatcher的对象时,我希望为指针初始化一个io_service对象。 现在我不太清楚如何做到这一点。 我查了两个不同的解决方案,但只有一个工作,我不太确定它是不是很好。 但请亲自看看:

CommandDispatcher::CommandDispatcher()
{
    m_ioservice.reset(new boost::asio::io_service);            // this actually works
    //m_ioservice = boost::make_shared<boost::asio::io_service>
    //    (new boost::asio::io_service);                     // this doesn't work
}

所以reset调用正在工作,但我认为这个实际上是重新分配指针。 所以使用它并没有错 ,但它似乎不是我最好的解决方案。 我在另一个问题中找到了make_shared调用的建议。 但是这个对我来说不起作用(我按官方提升示例中的描述实现了它)。 我明白了

/usr/local/include/boost/smart_ptr/make_shared.hpp:189: error: invalid conversion from 'boost::asio::io_service*' to 'size_t'

/usr/local/include/boost/smart_ptr/make_shared.hpp:189: error: initializing argument 1 of 'boost::asio::io_service::io_service(size_t)'

我现在不太清楚如何做到这一点,这将是最好的方式(也许还有一个完整的其他选择)。 或者也许我做得对,但是我对io_service错了。

希望这个问题还没有以这种方式出现在这里(我查了一些老问题,但似乎没有答案适合我)。

如果你正在使用make_shared ,那么你自己就不会使用new ; 你传递构造函数参数,它会为你创建对象。 在这种情况下,没有参数,所以只需:

m_ioservice = boost::make_shared<boost::asio::io_service>();

虽然在初始化列表而不是构造函数体中初始化它会更好:

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(boost::make_shared<boost::asio::io_service>())
{
}

使用make_shared的优点是它只执行单个内存分配,而使用new boost::asio::io_service进行初始化将需要两个(一个用于对象,一个用于共享引用计数)。

CommandDispatcher::CommandDispatcher()
   : m_ioservice(new boost::asio::io_service) // ver 1. this is how you should do it.
{
    //m_ioservice.reset(new boost::asio::io_service); // ver 2    
    //m_ioservice = boost::make_shared<boost::asio::io_service>(); // ver 3
}

好的方式可能是

CommandDispatcher::CommandDispatcher() : 
  m_ioservice(new boost::asio::io_service)
{
}

因为替代方法是首先默认构造shared_ptr ,然后重新分配它。

或者,等效使用make_shared

CommandDispatcher::CommandDispatcher() : 
  m_ioservice(boost::make_shared<boost::asio::io_service>())
{
}

有几种方法:

  • 对于简单的初始化,在构造函数列表中创建:

CommandDispatcher::CommandDispatcher() :
  m_ioservice( new boost::asio::io_service )
{
}
  • 使用工厂进行依赖注入:

CommandDispatcher::CommandDispatcher() :
  m_ioservice( Factory::Create() )
{
}
  • 通过传递已创建的对象使用依赖注入:

CommandDispatcher::CommandDispatcher( boost::shared_ptr< boost::asio::io_service > service ) :
  m_ioservice( service )
{
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM