2015-11-05 63 views
0

調用我有一個類X,我想一個成員函數bar傳遞給另一個類Y,將其存儲在一個載體,在其他時間調用它的存在。在向量保存成員函數,並確保對象仍然當後來

據我所知,當Y調用函數時,我需要確保X仍然存在。我怎麼做?

在我下面的例子中,我最初想,如果我通過一個shared_ptr來bar這將做我想做的 - 只要Y存在即的,那麼將X,爲Y持有一個shared_ptr到一個其成員函數。

我很確定現在這個邏輯是不正確的。有人可以請賜我嗎?

class Y { 
    std::vector<std::shared_ptr<std::function<void()>>> m_v; 
public: 
    void foo(const std::shared_ptr<std::function<void()>>& callback) { 
    m_v.push_back(callback); 
    } 

    void sometime_later() { 
    // invoke call back function in vector 
    // how do I ensure the object I want to call the function on still exists 
    } 
}; 

class X { 
    Y& m_y; 
public: 
    X(Y& y) : m_y(y) { 
    m_y.foo(std::make_shared<std::function<void()>>(std::bind(&X::bar, this))); 
    } 

    void bar() { 
    // do some stuff 
    } 
}; 
+0

您不能使用比foo,bar,X和Y更富有表現力的名稱來使代碼更具可讀性,並且這個想法更易於理解嗎? –

+0

你說的沒錯,持有一個'shared_ptr'到一個'std :: function',一個'X'的成員函數被綁定到''''''實例的生命週期根本沒有任何影響。沒有關於你最終想要做什麼的背景,推薦解決方案有點困難。 – melak47

+0

我不認爲'std :: shared_ptr'的矢量會做你想做的。你正在共享一個'std :: function'而不是'X'的實例。你應該思考當std :: shared_ptr被刪除時它會刪除什麼。 – quamrana

回答

0

我最終改變設計來解決我的有生之年問題。

而不是聲明一個矢量,如下所示:

std::vector<std::shared_ptr<std::function<void()>>> 

和晚些時候所存儲的功能發出呼叫,我聲明爲:

std::vector<std::shared_ptr<X>> 

,然後將物體上的要求X來實現一個命名函數(在我上面的示例中,它的名字是bar),然後在適當的時候調用它。這樣我確保在回調函數被調用時存在X.

0

這裏與shared_ptr的走樣構造程序一起使用std::enable_shared_from_this的實現:

#include <vector> 
#include <iostream> 
#include <memory> 
#include <functional> 

class Y { 
    std::vector<std::shared_ptr<std::function<void()>>> m_v; 
public: 
    void foo(const std::shared_ptr<std::function<void()>>& callback) { 
     m_v.push_back(callback); 
    } 

    void sometime_later(){ 
     for (const auto& f: m_v) { 
      (*f)(); 
     } 
    } 
}; 

class X : public std::enable_shared_from_this<X> { 
    Y& m_y; 
    std::function<void()> m_callback; 
public: 
    X(Y& y) : m_y(y), m_callback(std::bind(&X::bar, this)) { 
    } 

    void add() 
    { 
    m_y.foo(std::shared_ptr<std::function<void()>>{shared_from_this(), &m_callback}); 
    std::cout << shared_from_this().use_count() << "\n"; 
    } 

    void bar() { 
     std::cout << shared_from_this().use_count(); 
    } 
}; 
int main(){ 

    Y y; 
    { 
     auto x = std::make_shared<X>(y); 
     x->add(); 
    } 
    y.sometime_later(); 
} 

LIVE

+0

現在要運行,但如果您稍後需要,我會添加更多詳細信息 – Rostislav

相關問題