【发布时间】:2015-11-05 20:08:04
【问题描述】:
我有一个类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
}
};
【问题讨论】:
-
您能不能使用比 foo 、 bar、 X 和 Y 更具表现力的名称来使代码更具可读性和想法更易于理解?
-
你是对的,将
shared_ptr持有到std::function绑定了X的成员函数对X实例的生命周期完全没有影响。如果没有您最终要尝试做的事情的背景,推荐解决方案有点困难。 -
我不认为
std::shared_ptr的向量会做你想做的事。您正在共享std::function而不是X的实例。您应该考虑std::shared_ptr自己被删除时会删除什么。 -
@A.S.H 我认为这个想法是可以理解的。问题很明确。
标签: c++ c++11 callback std-function object-lifetime