簡體   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