2012-09-12 131 views
1

回調我有這需要更多的回調類.. 我試圖用一個接口來實現它們:如何實現與接口

class CallbacksInterface 
{ 
public: 
    virtual bool mycallback1() = 0; 
    virtual bool mycallback2() = 0; 
    virtual bool mycallback3() = 0; 
}; 

Class BusImplementation{ 
public: 
    addRequest(bool (CallbacksInterface::*callback)()); 

} 

回調是addRequest設置(參數)方法和定義如指向接口方法的指針。 所以我想添加請求..

//class with callbacks 
class Main:CallbacksInterface{ 
public: 
     bool mycallback1(){..}; 
     bool mycallback2(){..}; 
     bool mycallback3(){..}; 
     //.. 
} 

BusImplemantation bus; 
Main main; 

bus.addRequest(main.mycallback1);   
bus.addRequest(main.mycallback2); 
bus.addRequest(main.mycallback3); 

,但我不能傳遞一個回調到我BusImplemantation類

error: argument of type 'bool (Main::)()' does not match 'bool (CallbacksInterface::*)()' 

我覺得這是有模板的解決方案,但我編程嵌入式設備和我編譯器是有限的。

+0

那豈不是更簡單的有代表單一功能的回調接口,並通過指針的不同實現?或者甚至更好,使用''std :: functions''? – juanchopanza

+0

如果使用公共繼承,例如'class Main:public CallbacksInterface',它有幫助嗎? –

+0

爲了防止您使用實際軟件項目中的類型名稱 - BusImplemantation中存在拼寫錯誤。 –

回答

5

一個簡單的方法是定義一個接口類型代表一個功能:在必要時

struct ICallback 
{ 
    virtual bool operator()() const = 0; 
}; 

,並實現它多次:

struct Foo : ICallback 
{ 
    virtual bool operator()() const { return true;} 
}; 

struct Bar : ICallback 
{ 
    virtual bool operator()() const { return false;} 
}; 

那麼你的總線實現可以利用回調接口:

class BusImplemantation{ 
public: 
    void addRequest(const ICallback* callback) { .... } 
}; 

然後

BusImplemantation bus; 
Foo foo; // can be called: bool b = foo(); 
Bar bar; // can be called: bool b = bar(); 

bus.addRequest(&foo);   
bus.addRequest(&bar); 

您也可以調查使用std::function並避免共同的接口。

+0

看起來很有趣,我必須嘗試一下!這個operator()有特定的含義嗎?它對我來說是新的。謝謝 – Meloun

+1

@Meloun''operator()''使實例「可調用」。我在代碼中添加了一些註釋。如果你有''ICallback *'',你可以這樣調用運算符:''pCakkBack-> operator()();'' – juanchopanza

+0

**(* pCallBack)(); **?對我來說似乎更好。 – Meloun

0

我也強烈建議使用抽象接口。但是,如果你真的想出於某種原因,原來的做法,你需要的東西是這樣的:

void addRequest(bool (CallbacksInterface::*callback)(), CallbacksInterface* pTarget) {...} 
... 
bus.addRequest(&CallbacksInterface::mycallback1, &main); 
// ! Not &Main::mycallback1 - that wouldn't compile 
... 
// calling a callback 
(pTarget->*callback)();