0

あるクラスのミューテックスを別のクラスの異なるインスタンス間で共有する方法を考えていました。

現在、プライベートメンバー変数としてBoostmutexとcondition_variableを持つクラスIndexerがあります。メインにIndexerクラスのauto_ptrを作成し、Indexerのポインターを別のクラスRobotのインスタンスに渡します。

私は次のようにそれを行います:

std::auto_ptr<Indexer> index_service(new Indexer());
Robot a(*index_service.get());
Robot b(*index_service.get());
Robot c(*index_service.get());

ロボットのコンストラクターは次のとおりです。

Robot(Indexer &index_service)
{
  this->index_service = index_service;
}

ロボットのヘッダーは次のようになります。

class Robot
{
   public:
     Robot(Indexer &index_service);
   private:
     Indexer index_service;
};

ただし、ミューテックスはコピーできないため、エラーが発生します。

mutexとcondition_variableshared_ptrsを作成することを考えていましたが、これにより予期しない動作が発生する可能性があることを読みました。

誰かがこれを行うための適切な/正しい方法を教えてもらえますか?

ありがとうございました!

4

3 に答える 3

2

私はC++の第一人者ではありませんが、参照によるパスとポインターの不道徳な組み合わせがここで問題になっているようです。

具体的には次のようにします。this->index_service = index_service;
ただし、値は次のように渡されます。Indexer &index_service
ローカルindex_serviceはタイプIndexer index_service;
であるため、割り当てはコピーを意味すると思います。

のインスタンスが1つだけ必要であると想定しているIndexerので、実際には、そのインスタンスへの参照をRobotクラスに格納することを意味します。これを行うには、コンストラクターにポインターを取得させる必要があります(これは、*index_service.get()とにかく呼び出しが取得するものです)。さらに、クラス変数をポインター型にする必要があります。

于 2012-09-03T03:39:13.730 に答える
0

クラスで静的boost::mutexを宣言します。.cppファイルで定義することを忘れないでください。

ここをチェックしてください: クラスで静的ミューテックスを使用する

于 2012-09-03T03:19:04.907 に答える
0

クラスstd::shared_ptrの代わりに使用できる別のオプションと同様に、 std::shared_ptr`を変更std::auto_ptrします。RobotIndexer to

class Robot
{
public:
    Robot( std::shared_ptr<Indexer> const &index_service)
    {
        this->index_service = index_service;
}
private:
   std::shared_ptr<Indexer> index_service;
};

std::shared_ptr<Indexer> index_service(new Indexer());
Robot a(*index_service.get());
Robot b(*index_service.get());
Robot c(*index_service.get());
于 2012-09-03T11:53:08.590 に答える