2011-01-15 16 views
0

だから私は、そのインスタンスが実行されている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!) 
+1

mutexのロックとロック解除は、手動でリソースを管理しています*、C++ではできません。 Boostが行うSBRM(RAII)技法を使用して、これを代わりに行うべきです: '' void Set(int i){boost :: mutex :: scoped_lock lock(myMutex); myData = i} 'となります。今度はロックされたミューテックスは、何に関係なく自動的にロック解除されることが保証されています。そしてそれは一般的にきれいです。 (明らかに 'Get'でも同じことをやってくださいint上で動作するものについては大きな違いはありませんが(読みやすさだけ)、ロックとロック解除の間のステートメントは例外をスローすることができますので、それは重要です – GManNickG

+0

また、そこにありますか?パラメータを使って 'Get'関数が返ってくる理由は?それは非常に正統性のないことです。返ってからmutexのロックを解除する方法が分からなかったからです。 :)あなたはそれをしたいと思うでしょう:) – GManNickG

+0

OK、私はあなたが "Getter in A"と言ったときにあなたが 'get'関数を意味するかもしれないと思ったが、いつあなたは私を完全に失ったAの秘密に電話したかったと言った。 –

答えて

2

は、あなたがこのような何かをしたいような音。あなたはこのパターンよりも何かを求めていますか?

class Foo { 
public: 
    Foo(mySafeData& d) : data(d) {} 

    int someFunction() { 
     int i; 
     data.get(i); 
     return i; 
    } 
private: 
    mySafeData& data; 
}; 

... 
Foo f(a); 
+0

"bはaをデータソースとして使用しています(それは長い間" hm .. Aをどうやって殺すのですか? " - bの後でのみ、そしてそのようなBと私のAを殺す方法は?) – Rella

+0

@Kabumbus: – GManNickG

1

私はあなたがLINC /リンクによって何を意味するかわからない:

+0

これはまさに私が書いたものではありませんか? – GManNickG

+0

私は速くタイプすることができないので、あなたは受け入れられました:P – Karmastan

1

ポインタで何が問題になっていますか? Smart、Shared、Scoped ...今は標準のポインタを使用します。

class B 
{ 
public: 
    B(mySafeData* ptr) // constructor takes a memory pointer as parameter 
    :SafeData_ptr(ptr) 
    { 
    SafeData_ptr->foo(); // call public function from class A 
    } 

    ~B() // destructor 
    { 
    } 

private: 
    mySafeData* SafeData_ptr; // will hold the mem address of instance A when 
          // this class is initialized 
}; 

後のコードに、あなたはインスタンス準備を持っている場合、あなたはこのようなものだろう:

B b_demo(&A); // &A passes the memory address of the instantiated object 
       // and A::foo() will be automatically called when B is constructed. 

をこれはおそらくそれを行うための賢い方法ではありませんが、私はそれが示していると思いますアイディア。

+0

なぜ空のデストラクタですか? – GManNickG

+0

@GManそれを行う方法を示すためだけです。 – karlphillip

+0

Hm、ok私は本がやることを望むでしょう:) – GManNickG

関連する問題