だから私は、そのインスタンスが実行されているlincをクラス関数に渡して呼び出す方法は?
class mySafeData
{
public:
void Set(int i)
{
myMutex.lock();
myData = i;
myMutex.unlock();
}
void Get(int& i)
{
myMutex.lock();
i = myData;
myMutex.unlock();
}
private:
int myData;
boost::mutex myMutex;
};
のようなクラスを持っています。インスタンスAを呼び出すことができます。私は、Aからゲッターへの何らかの種類のリンクを開始引数として取り、必要に応じてプライベートメソッド内で呼び出すためのゲッターへのリンクを節約することができる新しいクラスを作成します。そんなことをする方法?
class myOtherData
{
public:
myOtherData(mySafeData& dataSource) :
myDataSource(&dataSource)
{}
private:
// note that if you take the advice in the comments,
// you don't need this wrapper function at all,
// it's simple just to call myDataSource.Get()
int GetData()
{
int result;
myDataSource.Get(result);
return result;
}
mySafeData* myDataSource;
};
mySafeData a;
myOtherData b(a);
// b uses a as its data source (make sure it lives as long!)
mutexのロックとロック解除は、手動でリソースを管理しています*、C++ではできません。 Boostが行うSBRM(RAII)技法を使用して、これを代わりに行うべきです: '' void Set(int i){boost :: mutex :: scoped_lock lock(myMutex); myData = i} 'となります。今度はロックされたミューテックスは、何に関係なく自動的にロック解除されることが保証されています。そしてそれは一般的にきれいです。 (明らかに 'Get'でも同じことをやってくださいint上で動作するものについては大きな違いはありませんが(読みやすさだけ)、ロックとロック解除の間のステートメントは例外をスローすることができますので、それは重要です – GManNickG
また、そこにありますか?パラメータを使って 'Get'関数が返ってくる理由は?それは非常に正統性のないことです。返ってからmutexのロックを解除する方法が分からなかったからです。 :)あなたはそれをしたいと思うでしょう:) – GManNickG
OK、私はあなたが "Getter in A"と言ったときにあなたが 'get'関数を意味するかもしれないと思ったが、いつあなたは私を完全に失ったAの秘密に電話したかったと言った。 –