2017-08-17 93 views
-1
class A { 
    void functionA(); 
}; 

class B { 
    A* A_; 
    void functionB(); 
}; 

如何可以自動調用functionB()class B例如,如果functionA()被稱爲外class B實例? (指向Class A實例的指針是class B實例的成員)。 我正在尋找類似Qt中的SIGNAL/SLOT方法。C++:呼叫B類的功能時,一類的一個函數被調用(指針A類B類的成員)

+0

哪個實例應該在'functionA'中執行'functionB'?這是[XY問題](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)? – Rakete1111

+2

Lookup _Observer Pattern_,回調函數,回調接口。 – user0042

+0

我有一個類(A類),它代表了應該由另一個類(B類)可視化的東西的描述。 我想將Class A傳遞給Class B.但是如果描述(類A中的某些內容)被某個函數改變,我想要在Class B中自動觸發相應的可視化函數。 – Thomas

回答

1

一種選擇是使用function object作爲回調。在下面的例子中,B的構造函數在A實例中註冊一個lambda function,只要調用了functionA,該實例將被A調用。這個lambda反過來簡單地調用functionB。

#include <functional> 
#include <iostream> 

class A { 
public: 
    void functionA() { 
     std::cout << "Function A called" << std::endl; 
     if (callback_) { 
      callback_(); 
     } 
    } 

    void setCallback(std::function<void(void)> callback) { 
     this->callback_ = callback; 
    } 

private: 
    std::function<void(void)> callback_; 
}; 

class B { 
public: 
    B(A* a) : A_(a) { 
     A_->setCallback([this](){this->functionB();}); 
    } 

    void functionB() { 
     std::cout << "Function B called" << std::endl; 
    } 

private: 
    A* A_; 
}; 

int main() { 
    A a; 
    B b = B(&a); 

    a.functionA(); 
} 

輸出:

Function A called 
Function B called 

正如你可以在輸出中看到,當a.functionA()被調用主,functionB也被自動調用。

相關問題