在子类构造函数中的接口类函数指针

问题描述:

我正在使用基于接口的编程工作。第一部分是针对上下文,以防万一有人说我正在做一些完全错误的事情或者采取了不同的方法来解决我的问题。在子类构造函数中的接口类函数指针

我有一个包含几个抽象接口类的容器类。这些定义函数返回我需要的数据。

该容器类具有不知道容器类的部分矢量,因此不包含接口标题。

每个部分都是同一类型的对象。创建这些对象时,它将一个函数指针作为参数传递给子对象的构造函数。该参数是指向在其中一个接口类中定义的函数的指针。

我试图将一个指针使用&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

正如你说的你自己,你的构造函数需要以下类型(不包括名称):

U16 (*)() 

但是,你正在试图通过以下类型:

U16 (iTheInterfaceClass::*)() 

你的构造函数接受*函数和类函数是静态的,但是您试图传递非静态成员函数。它们的类型不同。

您可以为接受成员函数的构造函数提供重载,也可以为成员函数将被调用的对象的引用或指针提供重载。

它可能看起来像:

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

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

假设你存储,在类中的一些变量某处的信息,然后你可以调用该函数像这样:

(member.*function)(); 

成员是一个变量,用于保存对要调用该函数的对象的引用,并且函数是保存指向所述成员f结。

+0

感谢您的解释。事实证明,我重新设计了系统以完全避免这个问题。这是一个死胡同的解决方案。 – 2015-03-25 18:04:03