コンストラクタ内でboost_bufferを初期化する

私は boost :: asio :: io_service オブジェクトを持つクラスを持っています。このオブジェクトを boost :: shared_ptr に保存します。

だから、私のヘッダーはこのように見えます(私は不要なコードを取り除き、それで気が散るわけではありません)

class CommandDispatcher
{
private:
    boost::shared_ptr m_ioservice;
public:
    CommandDispatcher();
};

CommandDispatcher のオブジェクトを作成するときに、ポインタのために io_service オブジェクトを初期化する必要があります。今私はこれをどうやって行うのかについてはあまりよく分かりません。私は2つの異なる解決策を探しましたが、1つだけが働いていて、それがいいのかどうかは分かりません。しかし、自分自身を参照してください:

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

したがって、 reset 呼び出しが機能していますが、実際にはポインタを再割り当てすることになります。だから、それを使うのは間違っていないですが、それは私にとって最も良い解決策のようには見えません。  私が別の質問で見つけた make_shared 呼び出しの提案。しかし、これは私のためにはうまくいきません(公式のboostの例で説明したように実装しました)。私は得る

/usr/local/include/boost/smart_ptr/make_shared.hpp:189:エラー: 'boost :: asio :: io_service *'から 'size_t'への無効な変換

/usr/local/include/boost/smart_ptr/make_shared.hpp:189:エラー: 'boost :: asio :: io_service :: io_service(size_t)'の引数1を初期化しています

私は今これをどうやって行うのかがはっきりしていません。これが最善の方法です(おそらくそれを行うための完全な他の選択肢があります)。あるいは、私はそれを正しくやっているかもしれませんが、 io_service が間違っています。

この質問が既にこのようにここにはないことを願っています(古い質問をいくつか見上げましたが、私にとっては答えが見当たりませんでした)。

6
まあ、私は実際には、公衆と私的メンバーの変数を宣言して公的方法と私的な方法を宣言することが「良い調子」だと考えていました。
追加された 著者 Toby,
プライベート変数がパブリックメソッドの前にリストされているのはなぜですか?確かに、プライベートな実装の詳細よりもパブリック・インタフェースが重要ですか? :)
追加された 著者 Mark Ingram,
私は、あなたがそれを達成するためにどのような変数を使うのかとは対照的に、ほとんどの人がパブリック・インターフェイスにもっと興味を持っていると思います。
追加された 著者 Mark Ingram,

4 答え

make_shared を使用している場合は、 new を自分で使用しないでください。それにコンストラクタの引数を渡すと、オブジェクトが作成されます。この場合、引数はないので、次のようにしてください:

m_ioservice = boost::make_shared();

コンストラクタ本体ではなく、初期化子リストで初期化する方が良いでしょう。

CommandDispatcher::CommandDispatcher() : 
    m_ioservice(boost::make_shared())
{
}

new boost :: asio :: io_service を使用した初期化では、2つのオブジェクトが必要になります(1つはオブジェクト用、2つ目は make_shared 1つは共有参照カウント用です)。

8
追加された
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();//ver 3
}
7
追加された
どのコールが「このコール」ですか?
追加された 著者 ronag,
追加された 著者 ronag,
+1はさまざまなバージョンであり、示唆としてそれを行う正しい方法の指示。その場合はver 2が必要かもしれません:クラスAのインスタンス化にクラスAが必要であると仮定し、クラスAをインスタンス化する前に何かをしなければならないとしますが、私はver 3を試しました。boostはmake_shared func、何かを含めるべきですか?
追加された 著者 MeM,
うん、これはうまくいくようですが、私が理解していないのは、この呼び出しの違いと実際には動作しない m_ioservice = new boost :: asio :: io_service です。
追加された 著者 Toby,
ハハはそれを少し曖昧にして申し訳ありません。 CommandDispatcher :: CommandDispatcher():m_ioservice(new boost :: asio :: io_service)は、sayin CommandDispatcher :: CommandDispatcher(){m_ioservice = new boostと同じではありません:: asio :: io_service; }
追加された 著者 Toby,
さて、私はそれを得る、非常にありがとう!
追加された 著者 Toby,
@Toby: m_ioservice(new io_service)は、生のポインタを取る明示的な shared_ptr コンストラクタを使用しています。代入演算子も未定義のコンストラクタも生ポインタを取っていないので、 m_ioservice = new io_service は機能しません。 reset を使用するか、明示的に shared_ptr を作成して割り当てる必要があります。
追加された 著者 Mike Seymour,

いい方法はおそらく

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

代わりにあなたがデフォルトで shared_ptr を構築してから、それを再割り当てする必要があるからです。

または、 make_shared を使用して同等の方法で

CommandDispatcher::CommandDispatcher() : 
  m_ioservice(boost::make_shared())
{
}
1
追加された

いくつかの方法があります:

  • 単純な初期化の場合は、コンストラクタのリストで作成します。

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 )
{
}
0
追加された