我正在將(至少)一些代碼轉換爲使用shared_ptr。然而,我遇到了我正在使用的Observer模式的問題。C++觀察者模式:原始指針vs shared_ptr?
我有一個演示者類(Model View Presenter),它實現了觀察者模式,並在某些事件發生時得到通知。我編寫了任何類都可以繼承的通用Subject/Observer類。更新方法看起來是這樣的:
void MyPresenter::Update(Subject *subject)
{
if(subject == myService_)
{
DoSomething();
}
else if(subject == myOtherService_)
{
DoSomethingElse();
}
}
這工作得很好,直到我轉換myService_
(MyPresenter類的成員)到std::shared_ptr
。現在表達式(subject == myService_)
不再有效。
我最終可能會將所有內容都轉換爲shared_ptr,但在那之前有一個簡單的方法可以讓我使用Observer模式支持raw指針和shared_ptr兩者?理想情況下,我希望觀察者模式對觀察者的指針實現不可知,但也許這是不可能的。我怎樣才能解決這個問題?
UPDATE
如果觀察者圖案Observer接口採取共享指針?還是更好地保持它作爲原始指針?目前我有:
class Subject;
class Observer
{
public:
virtual ~Observer() {}
virtual void Update(Subject *subject) = 0;
protected:
Observer() {}
};
使用Visual Studio 2010,我剛剛發現我可以使用'std :: shared_ptr'而不是'std :: tr1 :: shared_ptr'。 'unique_ptr'也是可用的。 – User
我來自C#,我真的得到關於shared_ptr的混合消息。一方面,人們說,編寫無漏洞的代碼真的很難,特別是當你考慮各種異常情況時,另一方面人們說不要使用它太多。儘管除了性能上的缺點,我還不太清楚使用智能指針的缺點。 – User
@User這會降低靈活性,因爲如果函數參數需要一個參數,您總是必須傳入'shared_ptr',但它不是必需的。在沒有所有權語義(也就是共享所有權)的情況下也使用'shared_ptr'-成員是最好的情況,在概念上是錯誤的,最壞的情況下會導致明顯的錯誤(儘量不要使用智能指針來處理動態分配的對象)。 –