我有一个类,它有一个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
错误的事情。
希望这个问题还没有以这种方式出现在这里(我查了一些旧问题,但似乎没有答案适合我)。
答案 0 :(得分:8)
如果您使用的是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
初始化将需要两个(一个用于对象,一个用于共享引用计数)。
答案 1 :(得分:7)
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
}
答案 2 :(得分:1)
漂亮的方式可能是
CommandDispatcher::CommandDispatcher() :
m_ioservice(new boost::asio::io_service)
{
}
因为替代方法是您首先默认构建shared_ptr
,然后重新分配它。
或者,等效地使用make_shared
:
CommandDispatcher::CommandDispatcher() :
m_ioservice(boost::make_shared<boost::asio::io_service>())
{
}
答案 3 :(得分:0)
有几种方法:
。
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 )
{
}