![](/img/trans.png)
[英]Assigning member function to callback with boost::bind and boost::function
[英]Passing a member function as a callback, boost::bind, boost::function
當研究使用boost :: bind和boost :: function將成員函數作為回調傳遞的可能性時,我偶然發現了一個好奇心。 我當時在愚弄兩個班級的模型。 第一個(有機體)通過int(void)函數(getAge)公開其成員變量(age)。 第二類(生物學家)將boost :: function作為成員存儲(callbackFunction),並使用它確定(takeNotes)正在研究的動物的當前年齡(將年齡保留在成員變量m_notes中)。 第二類的實例(steve_irwin)應該“監視”(takeNotes)第一類的實例(動物)。
這是實現Animal類的代碼:
class Organism {
public:
Organism(int = 1);
void growOlder();
int getAge(void);
void tellAge(void);
private:
int m_age;
};
Organism::Organism(int _age) : m_age(_age) {}
void Organism::growOlder() {
m_age++;
}
int Organism::getAge(void) {
return m_age;
}
void Organism::tellAge(void) {
std::cout << "This animal is : " << m_age << " years old!";
}
而這是實現Biologist類的代碼:
class Biologist {
public:
void setCallback(boost::function<int(void)>);
void takeNotes();
void tellAge();
private:
boost::function<int(void)> updateCallback;
int m_notes;
};
void Biologist::setCallback(boost::function<int(void)> _f) {
updateCallback = _f;
}
void Biologist::takeNotes() {
m_notes = updateCallback();
}
void Biologist::tellAge() {
std::cout << "The animal I am studying is : " << m_notes <<
" years old! WOW!" << std::endl;
}
主循環如下所示:
Organism animal(3);
Biologist steve_irwin;
boost::function<int(void)> f = boost::bind(&Organism::getAge, animal);
steve_irwin.setCallback(f);
steve_irwin.takeNotes();
steve_irwin.tellAge();
animal.tellAge();
animal.growOlder();
steve_irwin.takeNotes();
steve_irwin.tellAge();
animal.tellAge();
我創建了一只3歲的動物,我告訴史蒂夫·歐文(Steve Irwin)觀察它,他首先記下便正確地告訴了它的年齡,但是在動物長大之后又再次告訴它的年齡,他仍然認為動物是3歲舊。
程序的輸出:
The animal I am studying is : 3 years old! WOW!
This animal is : 3 years old!
The animal I am studying is : 3 years old! WOW!
This animal is : 4 years old!
我猜我無法通過引用將成員函數作為回調傳遞,但我無法確定在哪里。 你能幫助我嗎?
代替boost::function<int(void)> f = boost::bind(&Organism::getAge, animal);
應該是boost::function<int(void)> f = boost::bind(&Organism::getAge, &animal);
,因為如果執行上述操作,則boost :: bind會創建對象的內部副本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.