gpt4 book ai didi

c++ - 验证仿函数的目标对象

转载 作者:行者123 更新时间:2023-11-28 06:47:14 25 4
gpt4 key购买 nike

我有课foo接受指向类 bar 之一的成员函数指针的方法,但类 bar 的生命周期可能比 foo 短有没有办法让 Functor 检查 bar执行前是否存在?

目前,我正在尝试使用 std::functionbool 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com