簡體   English   中英

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);

}

每當我打電話分配給功能OnLeftClick()clickBar()的值totalContents不值更改為0(totalContents值由MClass的其它功能遞增)。

我在這里做錯什么了嗎?

std::bind調用中的this參數實際上是該函數的第一個參數。 對於成員函數,這必須是該函數所屬的類的實例,因為所有成員函數都有一個隱藏的第一個參數,即this指針。

因此,對於你的代碼工作中,第一個參數VScrollbar::Scrolldown必須是一個一個的實例VScrollbar類,而不是thisMClass 像這樣:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM