将成员函数作为回调传递,boost::bind、boost::function
Passing a member function as a callback, boost::bind, boost::function
在调查使用 boost::bind 和 boost::function 将成员函数作为回调传递的可能性时,我偶然发现了一种好奇心。我在玩两个 classes 的模型。第一个 (Organism) 通过一个 int(void) 函数 (getAge) 暴露它的成员变量 (age)。第二个 class (生物学家)存储一个 boost::function 作为成员 (callbackFunction) 并使用它来确定 (takeNotes) 它正在研究的动物的当前年龄(它将年龄保留在成员变量 m_notes).第二个 class 的一个实例 (steve_irwin) 应该 'watch' (注意)第一个 class 的实例(动物)。
这是实现动物的代码 class:
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!";
}
而这是实现生物学家的代码 class:
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岁的动物,我告诉史蒂夫欧文看它,他一开始记笔记后正确地告诉了它的年龄,但是当动物长大后他再次告诉它的年龄,他仍然认为这只动物是 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 会创建对象的内部副本。
在调查使用 boost::bind 和 boost::function 将成员函数作为回调传递的可能性时,我偶然发现了一种好奇心。我在玩两个 classes 的模型。第一个 (Organism) 通过一个 int(void) 函数 (getAge) 暴露它的成员变量 (age)。第二个 class (生物学家)存储一个 boost::function 作为成员 (callbackFunction) 并使用它来确定 (takeNotes) 它正在研究的动物的当前年龄(它将年龄保留在成员变量 m_notes).第二个 class 的一个实例 (steve_irwin) 应该 'watch' (注意)第一个 class 的实例(动物)。
这是实现动物的代码 class:
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!";
}
而这是实现生物学家的代码 class:
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岁的动物,我告诉史蒂夫欧文看它,他一开始记笔记后正确地告诉了它的年龄,但是当动物长大后他再次告诉它的年龄,他仍然认为这只动物是 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 会创建对象的内部副本。