これが質問ではなく議論であることは承知していますが、1 つまたは複数の回答を提供できると思いますので、どうぞ。
私はそのようなクラスを持っています
class MyAwesomeObject {
public:
std::mutex theListMutex;
std::list<int> theList;
};
さて、意図は非常に明白であり、例は意図的に学術的なものになっていると思いますが、私の現実からそれほど離れていません. 次に、私のアプリケーションは、そのようなオブジェクトを大量に処理します。それらはすべて別の場所にあるベクトルに格納されますが、すべて問題ありません。コンパイル時に問題が発生します。私は VS2012 を使用していますが、他のコンパイラでも同様のエラーが発生する可能性があると思います。
error C2248: 'std::mutex::mutex' : cannot access private member declared in class 'std::mutex'
1> c:\program files\microsoft visual studio 11.0\vc\include\mutex(116) : see declaration of 'std::mutex::mutex'
1> c:\program files\microsoft visual studio 11.0\vc\include\mutex(107) : see declaration of 'std::mutex'
1> This diagnostic occurred in the compiler generated function 'MyApp::MyAwesomeObject ::MyAwesomeObject (const MyApp::MyAwesomeObject &)'
ここでSOで他の多くの質問を行ったので、その意味は私には非常に明確です。基本的には「ミューテックスはコピーできない」と述べており、私はそれで問題ありません。したがって、これまでの私の戦略は、ミューテックスを a にして、それでshared_ptr<mutex>
完了することでした。唯一の「欠点」は、ミューテックスにアクセスするときにばかげた逆参照構文を使用する必要があることです。もちろん、これはまったくばかげているわけではなく、私が使用する他のすべてのドット表記の中で少しぎこちなく、際立っています。場所。
さて、私の質問に移りましょう:共有ポインタを使用して問題を解決する正しい方法はありますか? 私が知っている限り、所有権を他の人に譲渡していないので、代わりに一意のポインターを使用した可能性があります (オブジェクトのメンバーであるポインターでメソッドを呼び出すことが実際に所有権の譲渡の形式でない限り)? ミューテックスをコピーできないという事実を回避する他の方法はありますか?