std::bind的奇怪行为
strange behavior of std::bind
我使用这个std::bind
绑定类外的函数,并给出了一个奇怪的行为。
它在某种程度上控制了私有成员变量的值。
//MClass.h
typedef std::function<void(void)> Action;
class MClass {
public:
Action OnLeftClick;
//some other functions here
private:
int totalContents;
VScrollbar* _vscrollbar;
};
//MClass.cpp
在这种实现中,它不会产生任何错误:
MClass::MClasss() {
OnLefClick = std::bind(&VScrollbar::Scrolldown, this);
}
//but when I do this
//otherfile.h
MClass mclass;
void clickBar() {
mclass.totalContents = 0;
}
void InitComponentns() {
mclass.OnLeftClick = std::bind(clickBar, mclass);
}
并且每当我调用分配给CCD_ 2的函数即CCD_,CCD_ 4的值不改变为0(totalContents值由MClass的其它函数递增)。
我在这里做错什么了吗?
std::bind
调用中的this
参数实际上是函数的第一个参数。对于成员函数,它必须是该函数所属类的实例,因为所有成员函数都有一个隐藏的第一个参数,即this
指针。
因此,要使代码工作,VScrollbar::Scrolldown
的第一个参数必须是VScrollbar
类的实例,而不是MClass
中的this
。像这样:
OnLefClick = std::bind(&VScrollbar::Scrolldown, _vscrollbar);
对于第二个std::bind
调用,您应该只向它传递函数指针,因为它是一个不带参数(隐藏或不隐藏)的函数:
mclass.OnLeftClick = std::bind(clickBar);
不过,我对问题中的代码构建感到惊讶,因为totalContents
成员变量是私有的,不能从clickBar
函数访问。
首先,您不能将mclass绑定到clickBar,因为函数不带参数。您可以修改函数以引用MClass
:
void clickBar(MClass& m) { m.totalContents = 42; }
其次,即使可以,bind也会复制mclass。您可以使用std::ref
:传递std::reference_wrapper
#include <functional>
struct MClass { int totalContents = 0;};
void clickBar(MClass& m) { m.totalContents = 42; }
int main() {
MClass mclass;
auto OnLeftClick = std::bind(clickBar, std::ref(mclass));
OnLeftClick();
}
相关文章:
- POCO::PostgreSQL:如何将std::vector支持添加到`Binder::bind`
- 使用 std::应用于 std::bind
- PCL:当我在setConditionFunction中使用std::bind 时,没有合适的转换函数
- std::bind on statd::array 的运算符 []
- std::bind c++ in if statement
- std::bind 是否实现了 std::ref 和 std::cref 来消除函数调用的歧义?
- C++ 事件管理器的回调,使用 std::function 和 std:bind 以及派生类作为参数
- 试图克服 std::bind 编译错误
- c++ std::bind within function
- std::bind to void* to std::function
- std::bind,无法让具有单个参数的方法工作
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 在调用 std::bind 的产品后意外调用析构函数
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 我们应该在使用 std::bind 应用之前检查一个不为空的函数吗?
- 为什么 std::bind 静态类型检查传递给函数的参数?
- 对函数库中的语法感到困惑 std::bind
- std::bind std::shared_ptr 参数不会增加use_count
- c++ 11: bind std::sort用于用户定义的类型,然后使用该绑定作为ctor的参数
- C++如何使用std::bind/std::函数引用模板函数