[英]c++ Observer Pattern: raw pointers vs shared_ptr?
我正在將(至少)我的一些代碼轉換為使用shared_ptr。 但是我遇到了我正在使用的Observer模式的問題。
我有一個演示者類(Model View Presenter),它實現了Observer模式,並在某些事件發生時得到通知。 我編寫了任何類都可以繼承的通用Subject / Observer類。 update方法如下所示:
void MyPresenter::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
這工作正常,直到我將myService_
(MyPresenter類的成員)轉換為std::shared_ptr
。 現在表達式(subject == myService_)
不再有效。
我最終可能會將所有內容轉換為shared_ptr,但在此之前,我是否有一種簡單的方法來支持原始指針和帶有Observer模式的shared_ptr? 理想情況下,我希望觀察者模式與觀察者的指針實現無關,但也許這是不可能的。 我怎樣才能解決這個問題?
UPDATE
觀察者模式Observer接口應該采用共享指針嗎? 或者將它作為原始指針更好? 目前我有:
class Subject;
class Observer
{
public:
virtual ~Observer() {}
virtual void Update(Subject *subject) = 0;
protected:
Observer() {}
};
為了使這個工作myService_和主題需要是shared_ptr。 否則,如果subject和shared_ptr指向同一個對象,您可以嘗試比較它。
subject == myService_.get()
否則嘗試將所有指針更改為shared_ptr。
你可以使用shared_ptr
的get成員,它返回shared_ptr
包裝的原始指針:
subject == myService_.get()
一般來說,我不建議盲目地將所有原始指針轉換為shared_ptr
。 你總是要考慮周圍的對象是否真的擁有指向的對象(並且共享所有權仍然是所有權)。 有時std::unique_ptr
(雖然我不知道tr1
已經有了,否則std::auto_ptr
)是一個更好的選擇,如果它是嚴格的所有權或者只是一個原始指針,如果它不是所有權。
但是在接口中,特別是函數參數和返回值,原始指針通常比使用智能指針更好,因此降低了通用性(以及性能,雖然只是微不足道,但對於shared_ptr
更是如此)。
注意:我知道這和現有的答案是一樣的,但我絕對覺得有必要不要建議在所有地方使用shared_ptr
。
為什么不簡單地讓模型繼承自std::enable_shared_from_this
。 如果所有權共享,則可以從模型的(可能是虛擬的)方法返回shared_from_this
。 請注意,這對模型的構造函數有一些限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.