0

私のコードでは、Complex および Composition クラスのコピー コンストラクターを意図的に定義していません。コンパイラから提供されたコピー コンストラクタを使用したい

#include<boost/make_shared.hpp>
#include<boost/shared_ptr.hpp>
#include <boost/thread/mutex.hpp>

class Complex
{ 
  private : 
  std::string _a;
  std::string _b;
};

class Composition
{
  public:
    Composition(){}
    Composition(int x, int y)
    {
      _x = x;
      _y = y;
    }
  private:
    int _x;
    int _y;
    Complex obj;
};

int main()
{
  //Used make_shared this way on purpose
  boost::shared_ptr<Composition> ptr = boost::make_shared<Composition>(Composition(1,2) );
}

上記のコードは問題なくコンパイルされます。

次に、複雑なクラスを次のように変更します

class Complex
{
  private : 
  std::string _a;
  std::string _b;
  boost::mutex _mutex;
};

コードをコンパイルすると、エラーが発生します

/usr/local/include/boost/smart_ptr/make_shared.hpp:660: error: no matching function for call to ‘Composition::Composition(const Composition&)’
note: candidates are: Composition::Composition(int, int)
note:                 Composition::Composition()
note:                 Composition::Composition(Composition&)

コンポジションで独自のコピー コンストラクターを空のボディで定義することで、この問題を解決しました。

ただし、あるケースでは独自のコピー コンストラクターを作成する必要があり、別のケースではコンパイラーが生成したコピー コンストラクターを使用できた理由はまだわかりません。もちろん、犯人はミューテックスです。この問題を引き起こしているのは、ミューテックスのコピーできないプロパティですか、それとも私が見逃しているものですか?

4

1 に答える 1

2

このページから

クラスミューテックス

ミューテックス クラスは Mutex およびNonCopyableのモデルであり、これらの概念の要件を超える追加機能は提供しません。

boost::mutexは NonCopyable であるため、クラスにメンバーとして含まれている/継承されている場合、コンパイラはコピー コンストラクターを生成しません。

于 2015-06-10T07:30:18.157 に答える