将指向 class 函数的指针分配给指向函数的指针

Assign pointer to class function to pointer to function

我正在尝试将指向 class 函数的指针作为变量发送到另一个 class。我试图将两个 class 分开,这样我就可以重用代码而无需在将来进行编辑。

我正在 Windows 7 上编译,使用 Visual Studio 2015.

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,而实际上并不知道它是嵌套的 class.

我在编译过程中得到的错误是:

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

我可以定义一个标准函数并调用它,但这并不是每个父类所独有的,然后我必须指定我指的是哪个 parentClass::doSomething。

我找到的最简单的解决方案是将childClass中指向函数的指针重新定义为void(parentClass::*)(),这正是我想要的,但不是怎么样我想要。

话虽如此,我不知道该把这个拿去哪里,还有别的办法吗?类似的东西?

编辑:

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

所以...

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

还是接收端总是要提前知道"parentClass::"?那么现在是使用 void 指针的好时机吗?

我是在追自己的尾巴还是这是要去哪里?

编辑:

这样的事情看起来很危险,但是,它就在这里。

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

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

在这种情况下 "classInformation.something" 会是什么?

问题是 class 成员函数需要知道 class 变量在哪里,它不知道如果它所要做的只是指向 class 函数没有引用它所属的对象。所以 parentClass::* 隐式地有一个指向对象的指针,而函数指针则没有。

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

也许有一个更基本的潜在问题可以让您绕过这个限制。例如,与其问你是否可以做到这一点,也许有一种不同的方式可以完成你想用它做的任何事情。

函数指针确实有局限性。我建议改用 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(); }};