2015-03-24 108 views
0

我正在使用基於接口的編程工作。第一部分是針對上下文,以防萬一有人說我正在做一些完全錯誤的事情或者採取了不同的方法來解決我的問題。在子類構造函數中的接口類函數指針

我有一個包含幾個抽象接口類的容器類。這些定義函數返回我需要的數據。

該容器類具有不知道容器類的部分矢量,因此不包含接口標題。

每個部分都是同一類型的對象。創建這些對象時,它將一個函數指針作爲參數傳遞給子對象的構造函數。該參數是指向在其中一個接口類中定義的函數的指針。

我試圖將一個指針使用&iTheInterfaceClass::theDataFunction傳遞給期望U16(*pDataFunction)()的構造方法。

這將導致錯誤 cannot convert 'U16 (iTheInterfaceClass::*)() {aka short unsigned int (iTheInterfaceClass::*)()}' to 'U16 (*)() {aka short unsigned int (*)()}' in initialization

如果部件包括.h文件,我能得到這個工作,因爲我只是匹配原型包括在構造函數的命名空間。但是,這打破了我的抽象。如果每個部分都包含不同的界面,我必須爲每個部分創建單獨的類,即使功能相同。

有沒有辦法在沒有完全調整我的策略的情況下匹配原型?

+0

您將需要使'theDataFunction'靜態。但使用函數指針與對象「味道不好」。 – 2015-03-24 23:44:33

+0

你運氣不好。成員函數需要'this'的附加參數。 – 2015-03-24 23:45:27

+0

@MatsPetersson如果對象之間唯一不同的是共享接口中的函數調用(數據的位置),具體來說,這是爲什麼「聞起來很糟糕」? – 2015-03-27 20:11:49

回答

0

正如你說的你自己,你的構造函數需要以下類型(不包括名稱):

U16 (*)() 

但是,你正在試圖通過以下類型:

U16 (iTheInterfaceClass::*)() 

你的構造函數接受自由函數和類函數是靜態的,但是您試圖傳遞非靜態成員函數。它們的類型不同。

您可以爲接受成員函數的構造函數提供重載,也可以爲成員函數將被調用的對象的引用或指針提供重載。

它可能看起來像:

public: 
    typedef U16(iTheInterfaceClass::*MemberFunctionPtr)(); 

    MyContainer(iTheInterfaceClass& member, MemberFunctionPtr function) : ... { ... } 

假設你存儲,在類中的一些變量某處的信息,然後你可以調用該函數像這樣:

(member.*function)(); 

成員是一個變量,用於保存對要調用該函數的對象的引用,並且函數是保存指向所述成員f結。

+0

感謝您的解釋。事實證明,我重新設計了系統以完全避免這個問題。這是一個死衚衕的解決方案。 – 2015-03-25 18:04:03