2012-09-03 120 views
0

我想知道如何在另一個類的不同實例中共享一個類中的互斥量。如何在一個類的不同實例之間共享一個互斥量?

現在,我有一個類Indexer,它有一個Boost互斥體和condition_variable作爲私有成員變量。我在我的main中創建一個Indexer類的auto_ptr,並將Indexer的指針傳遞給另一個類Robot的實例。

我是這樣做的以下內容:

std::auto_ptr<Indexer> index_service(new Indexer()); 
Robot a(*index_service.get()); 
Robot b(*index_service.get()); 
Robot c(*index_service.get()); 

機器人的構造函數是:

Robot(Indexer &index_service) 
{ 
    this->index_service = index_service; 
} 

機器人的頭看起來像:

class Robot 
{ 
    public: 
    Robot(Indexer &index_service); 
    private: 
    Indexer index_service; 
}; 

然而,由於互斥是不可複製的,我得到一個錯誤。

我正在考慮讓互斥鎖和condition_variable shared_ptrs,但我讀到這可能會導致意外的行爲。

有人可以告訴我正確/正確的方法來做到這一點嗎?

謝謝!

+1

我想在你的機器人類中,你的意思是有一個Indexer類型的變量? –

回答

2

我不是一個C++大師,但它通過引用好像通的邪惡組合和指針是這裏的麻煩。

具體來說,你這樣做:this->index_service = index_service;
但值傳遞爲Indexer &index_service
,並且由於局部index_service是類型Indexer index_service;
我相信,分配意味着副本。

我假設你只想要一個Indexer的實例,所以你真的有意在你的Robot類中存儲對它的引用。要做到這一點,你會想讓你的構造者拿一個指針(這就是*index_service.get()調用讓你無論如何)。此外,你希望你的類變量是一個指針類型。

+0

這似乎已經解決了,謝謝!我需要回顧一些我的代碼,並確保我沒有製作本地副本......做完這些後,我需要將其更改爲index_service.get() – noko

+0

啊,是的,這是有道理的。我的聲明「這是什麼* index_service.get()調用讓你無論如何」是錯誤的......這將取消返回get(給你的對象)這是好的如果你的構造函數是通過引用傳遞,因爲C++爲你做了魔術...... –

0

正如另一種選擇,你可以代替std::auto_ptr並在Robot類變化Indexer to的std :: shared_ptr`使用std::shared_ptr

class Robot 
{ 
public: 
    Robot(std::shared_ptr<Indexer> const &index_service) 
    { 
     this->index_service = index_service; 
} 
private: 
    std::shared_ptr<Indexer> index_service; 
}; 

std::shared_ptr<Indexer> index_service(new Indexer()); 
Robot a(*index_service.get()); 
Robot b(*index_service.get()); 
Robot c(*index_service.get()); 
相關問題