将指向类函数的指针指定给指向函数的指针

时间:2016-01-22 14:22:24

标签: c++ function-pointers

我试图将指向类函数的指针作为变量发送到另一个类。我试图将两个类分开,以便我可以重用代码,而不必在将来编辑它。

我使用Visual Studio 2015在Windows 7上进行编译。

DATASTRUCT dataItem = {0, 1, 0, 1, dataText, parentClass::doSomething};

childClass.addItem(dataItem); //childClass is initiated as a member of parentClass

其他地方:

typedef struct dataStruct{
    double min_x;
    double max_x;
    double min_y;
    double max_y;
    GLTEXT label; //custom struct for text information
    void(*function)(void);
}DATASTRUCT;

我希望childClass能够开展业务并检查某些参数,当childClass完成时,我希望它从parentClass调用doSomething,而不是实际知道它是嵌套类。

我在编译期间得到的错误是:

void(parentClass :: )()不能用于初始化void()()的实体。

我能够定义一个标准函数并调用它,但这对于每个parentClass并不是唯一的,然后我必须指定我所引用的parentClass :: doSomething。

我找到的最简单的解决方案是将childClass中的函数指针重新定义为void(parentClass :: *)(),这正是我想要的,但不是 如何 < / strong>我想要它。

话虽如此,我不知道该把它带到哪里,还有另外一种方法吗?类似的东西?

编辑:

如果可能,我将如何显式发送childClass所需的信息,以便动态地正确解释函数指针。

因此...

childClass.addItem(classInformation, dataItem, &parentClass::doSomething);

或者接收端总是必须知道&#34; parentClass ::&#34;提前?那么这是使用void指针的好时机吗?

我是在追逐自己的尾巴还是在某个地方?

编辑:

这样的事情似乎很危险,但是,现在就是这样。

childClass.addItem(classInformation, dataItem, static_cast<void*>(&parentClass::doSomething));

childClass::callParent(classInformation, void*function){
    static_cast<classInformation.something*>(function)();
}

什么会&#34; classInformation.something&#34;在这种情况下?

2 个答案:

答案 0 :(得分:0)

问题是类成员函数需要知道类变量的位置,它不知道是否所有它必须继续是一个函数指针到类函数而不引用它的对象是...的成员。所以parentClass :: *隐式具有指向对象的指针,而函数指针则没有。

从根本上说,您需要跟踪对象以调用其成员函数之一。您可以使用指向该对象的指针并从中调用成员函数,或者您可以使用parentClass :: *,它在幕后执行几乎相同的操作。

也许有一个更基本的基本问题可以让你解决这个限制。例如,不是问你是否能做到这一点,也许你可以通过不同的方式完成你想要做的任何事情。

答案 1 :(得分:0)

函数指针确实是限制性的。我建议改用std::function<void()>。请注意,您仍然必须告诉哪个对象成员函数将在其上运行。您可以使用std::bind或lambda来执行此操作:

DATASTRUCT dataItem = 
    {0, 1, 0, 1, dataText, std::bind(&parentClass::doSomething, std::ref(someParentClassObject))};
//or
DATASTRUCT dataItem = 
    {0, 1, 0, 1, dataText, [&someParentClassObject](){ someParentClassObject.doSomething(); }};