作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有课foo
接受指向类 bar
之一的成员函数指针的方法,但类 bar 的生命周期可能比 foo
短有没有办法让 Functor 检查 bar
执行前是否存在?
目前,我正在尝试使用 std::function
的 bool operator
没有成功。
class Foo
{
public:
void Foo::SetCallback( std::function< void( void ) > cb )
{
_cb = cb; // My Bar class will call this to assign a Bar member function pointer to Foo's _cb member variable
}
void Foo::CallCallback()
{
if( _cb ) _cb(); // This evaluates to true even if the original bar object has been destroyed
//I want this callback to only execute if the bar object exists
}
private:
std::function< void( void ) > _cb;
};
class Bar
{
public:
Bar( Foo* _foo )
{
_foo->SetCallback( std::bind( &myCalledbackFunc, this );
}
void myCalledbackFunc()
{
//do stuff
}
};
最佳答案
我想不出任何简单的方法让 Foo 知道回调对象何时被销毁,但如果你真的想从 Foo 类验证对象是否还活着,我会在某个地方使用 weak_ptr路。如果您通过 new
创建 Bar,您可以通过 make_shared
创建实例,您会做这样的事情(额外的成本是在每次构造一个酒吧实例):
class Bar;
class Foo
{
public:
void Foo::SetCallback( std::function< void( void ) > cb )
{
_cb = cb;
}
void Foo::RegisterBar(std::weak_ptr<Bar> inbarPtr)
{
barRef = inbarPtr;
}
void Foo::CallCallback()
{
if( _cb && !barRef.expired()) _cb();
}
private:
std::function< void( void ) > _cb;
std::weak_ptr<Bar> barRef;
};
class Bar
{
public:
Bar( Foo* _foo )
{
_foo->SetCallback( std::bind( &Bar::myCalledbackFunc, this ));
}
void myCalledbackFunc()
{
//do stuff
}
};
int main()
{
Foo fooInstace;
std::shared_ptr<Bar> barInstance = std::make_shared<Bar>(&fooInstace);
fooInstace.RegisterBar(barInstance);
return 0;
}
如果你真的坚持只更改 Bar 类,你可以使用这个丑陋的 hack 和一个空的自定义删除器:
class Bar;
class Foo
{
public:
void Foo::SetCallback( std::function< void( void ) > cb , std::weak_ptr<Bar> inbarPtr)
{
_cb = cb;
barRef = inbarPtr;
}
void Foo::CallCallback()
{
if( _cb && !barRef.expired()) _cb();
}
private:
std::function< void( void ) > _cb;
std::weak_ptr<Bar> barRef;
};
class Bar
{
std::shared_ptr<Bar> selfPtr;
public:
Bar( Foo* _foo )
{
selfPtr = std::shared_ptr<Bar>(this, Bar::EmptyDeleter);
_foo->SetCallback( std::bind( &Bar::myCalledbackFunc, this ), selfPtr);
}
void myCalledbackFunc()
{
//do stuff
}
protected:
static void EmptyDeleter(Bar*)
{
}
};
关于c++ - 验证仿函数的目标对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24743265/
我是一名优秀的程序员,十分优秀!