2015-11-06 156 views
3

以下觀察者類在其ctor執行時通過調用attach向主題註冊回調函數。我希望觀察員的註銷者註銷回調函數。將shared_ptr傳遞給std :: function(成員函數)

我該如何將detach的指針傳遞給attach,以便主題可以將其從觀察者列表中刪除?

我想我要存儲shared_ptrthis,但我不知道我是如何從獲取到shared_ptr的成員函數callback

任何人都可以幫忙嗎?

Observer::Observer(Subject& subject) : m_subject(subject), 
{ 
    m_subject.attach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this))); 
} 

Observer::~Observer() 
{ 
    // I tried this initially but realised that the pointer below 
    // is different to the one passed to `attach` from the ctor. 

    m_subject.detach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this))); 
} 

void Observer::callback() 
{ 
    // do some stuff 
} 

attachdetach聲明如下:

void Subject::attach(const std::string& command, const std::shared_ptr<std::function<void()>>& callback); 

void Subject::detach(const std::string& command, const std::shared_ptr<std::function<void()>>& callback); 
+0

爲什麼在ctor參數列表中不使用'const Subject&'是否有特殊原因?我問,因爲你明顯的複製 - 無論如何正在構建一個副本。 – Superlokkus

+0

@Superlokkus因爲'Subject :: attach'不是'const'。 – ksl

+0

那麼'm_subject'也是一個'Subject&'呢?否則,你正在創建你的主題的副本,然後它是無關緊要的。 – Superlokkus

回答

1

我會建議中還存放了shared_ptr的副本在你的觀察器類,作爲成員可能。然後你可以給它指定detach

像這樣:

class Observer { 
    //Other Stuff here 

private: 
    std::shared_ptr<std::function<void()>> callback_ptr; 
}; 

Observer::Observer(Subject& subject) : 
m_subject(subject), 
callback_ptr(std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this)) 
{ 
    m_subject.attach("cmd", std::make_shared<std::function<void()>>(std::bind(&Observer::callback, this))); 
} 

Observer::~Observer() 
{ 
    m_subject.detach("cmd", callback_ptr)); 
} 

值得一提的是,作爲@dkg還提到,make_shared也總是爲每它被稱爲時間返回一個新的shared_ptr,因爲它的目的是「創建一個新對象以下參數並返回shared_ptr「。大致相當於shared_ptr(new std::function<void()> (std::bind(&Observer::callback, this))。 爲什麼還有一個額外的make_shared函數是爲了最大限度地減少分配並保證長時間表達式的異常安全。 如果您只想共享一個對象,那麼只需分發您的shared_ptr副本

+1

這就是解決方案。否則,使用'make_shared'在dtor中創建一個新實例,傳遞的共享指針指向這個新實例,而不是在ctor中創建的實例。 –

1

每當您撥打std::make_shared時,它會爲您分配並構建一個新對象。

在你的代碼中,你調用它兩次,然後你有兩個不同的對象實例。

你可以調用它一次,並保持共享指針作爲你的類的成員。

相關問題