簡體   English   中英

c ++觀察者模式:原始指針vs shared_ptr?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM