2011-01-15 32 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的Getter的鏈接,並且能夠以某種方式保存到該getter的鏈接,以便在它需要的私有方法內調用它。如何做這樣的事情?

+1

互斥鎖的加鎖和解鎖是*手動管理資源*,這是我們在C++中無法做到的。你應該使用Boost所做的SBRM(RAII)技術,而不是這樣做:「void Set(int i){boost :: mutex :: scoped_lock lock(myMutex); myData = i}'。現在,一旦被鎖定,互斥量將被保證自動解鎖*不管是什麼*。一般來說它更乾淨。 (很明顯,在'Get'中做同樣的事情,對於在int上運行的東西,這不會產生太大的區別(只是可讀性),但鎖和解鎖之間的語句可以拋出異常,這很關鍵。 – GManNickG

+0

你的'Get'函數返回的原因是什麼?這非常非正統,我懷疑這是因爲你在返回之後不知道如何「解鎖」互斥體,如果你在上面的評論中做了我所說的話,就像我說的你可以回覆得很好,靜音解鎖自己,你會想要這樣做:) – GManNickG

+0

好的,我想你可能是指'get'函數,當你說,「連接到A的Getter」,但是當你說你想打電話給A的私處,你完全失去了我。 –

回答

2

聽起來像是你想是這樣的:

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!) 
+0

「b使用a作爲其數據源(確保它的壽命長於」hm ..我如何殺死a? - 僅在b之後?以及如何殺死這樣的B和我的A? – Rella

+0

@Kabumbus:好吧,如果它們是自動(堆棧)分配,就像函數中的常規變量一樣,它們在函數結束時消失。 – GManNickG

1

我不知道你所說的LINC /鏈接的意思。你是否要求比這種模式更多的東西?

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

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

... 
Foo f(a); 
+0

這不正是我寫的內容嗎? – GManNickG

+0

是的,但是由於無法快速輸入,所以您的程序已被接受:P – Karmastan

1

指針有什麼問題?智能,共享,作用域...現在我將使用標準指針。

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

嗯,好吧,我想,儘管我希望這是一本書會做的。 – GManNickG

相關問題