【发布时间】:2016-01-22 14:22:24
【问题描述】:
我正在尝试将指向类函数的指针作为变量发送到另一个类。我试图将这两个类分开,这样我就可以重复使用代码,而无需在将来对其进行编辑。
我在 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,而实际上并不知道它是一个嵌套类。
我在编译过程中得到的错误是:
void(parentClass::)() 不能用于初始化 void()() 的实体。
我可以定义一个标准函数并调用它,但这并不是每个 parentClass 所独有的,然后我必须指定我所指的 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”会是什么?
【问题讨论】:
-
成员函数需要一个他们可以操作的对象。在您的案例中,您将如何指定要访问哪一个?
-
顺便说一句,你真的应该使用
&parentClass::doSomething。只有 MSVC 会原谅你错过了&,这只是因为他们试图与 VC++6 兼容。 -
@MSalters 我会记住这一点,我曾经在 c 中的函数指针之前添加 &,但我开始在 c++ 中遇到类似指针的奇怪错误。到目前为止,我注意到 Visual Studio 似乎更喜欢没有。
标签: c++ function-pointers