[英]Storing member function in a vector and ensuring object still exists when invoked later
我有一个类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
}
};
这是将std::enable_shared_from_this
与shared_ptr
的别名构造函数结合使用的实现:
#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();
}
我最终更改了设计以解决我的一生问题。
而不是声明一个向量,如下所示:
std::vector<std::shared_ptr<std::function<void()>>>
然后在某个时间对存储的函数发出调用,我将其声明为:
std::vector<std::shared_ptr<X>>
然后对对象X提出要求,以实现一个命名函数(在上面的示例中,它应该是bar
),然后在适当的时候调用它。 这样,我确保在调用回调函数时X存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.