[英]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);
}
每當我打電話分配給功能OnLeftClick()
即clickBar()
的值totalContents
不值更改為0(totalContents值由MClass的其它功能遞增)。
我在這里做錯什么了嗎?
std::bind
調用中的this
參數實際上是該函數的第一個參數。 對於成員函數,這必須是該函數所屬的類的實例,因為所有成員函數都有一個隱藏的第一個參數,即this
指針。
因此,對於你的代碼工作中,第一個參數VScrollbar::Scrolldown
必須是一個一個的實例VScrollbar
類,而不是this
在MClass
。 像這樣:
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();
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.