簡體   English   中英

將成員函數作為回調傳遞,boost :: bind,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會創建對象的內部副本。

請參閱Boost文檔以獲取boost :: bind

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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