2016-01-22 143 views
0

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

我编写在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,但实际上并不知道它是嵌套类。

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

无效(父类:: )()不能用于初始化的无效()实体()。

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

我发现最简单的办法是重新定义指针childClass运作为void(父类:: *)(),这正是我想要的,但不是如何我想它。

有了这个说法,我不知道在哪里拿这个,有没有另一种方式?相似的东西?

编辑:

如果可能的话,我将如何明确送我childClass正确解读动态函数指针所需要的信息。

所以......“父类::”提前

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

或者不接收端总是有知道的吗?那么现在是使用void指针的好时机吗?

我是追着我自己的尾巴还是这是去某个地方?

编辑:

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

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

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

什么是“classInformation.something”在这种情况下?

+0

成员功能需要一个对象,他们将操作。你如何指定你想要访问哪一个? –

+0

顺便说一句,你真的应该使用'&parentClass :: doSomething'。只有MSVC会原谅你错过'&',那只是因为他们试图与VC++ 6进行bug兼容。 – MSalters

+0

@MSalters我会记住这一点,我曾经在c中添加&之前的函数指针,但是我开始在C++中出现类似指针的奇怪错误。到目前为止,我注意到Visual Studio似乎更喜欢没有。 – Jarred

回答

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(); }}; 
+0

从来没有听说过它,看起来很混乱,但我终于有时间在电脑前试用它,它使用std :: function/bind没有任何问题。更不用说,这对函数调用没有任何影响,保留了我想要的格式。你是一个野兽。去有一个美妙的一天。 – Jarred

0

问题是,类成员函数需要知道类变量是哪里,它不知道它是否必须继续是一个指向类函数的函数指针,而不引用它是成员之一。所以一个parentClass :: *隐式地有一个指向该对象的指针,而一个函数指针则不会。

基本上,您需要跟踪对象才能调用其某个成员函数。您可以使用指向对象的指针并从中调用成员函数,也可以使用parentClass :: *,它在后台执行几乎相同的操作。

也许有一个更基本的潜在问题,可以让你解决这个限制。例如,与其问你是否可以这样做,也许有一种不同的方式可以完成你试图用它做的任何事情。

+0

如果您使用指向函数的类指针指向函数,为什么parentClass需要知道变量的位置?这不就是函数本身意识到在一组内存位置开始的东西吗? – Jarred

+0

成员函数本身位于内存位置,但它不知道编译器传递指针时它是哪个类的哪个实例。成员函数被编译和链接,然后它的一个副本位于内存中的某个位置。每次创建新对象时,程序都不会创建该代码的新副本 - 这意味着将为该类的所有实例调用相同的代码,因此代码不知道哪个实例正在调用它,除非它获得传递了一个指针。编译器隐式传递指针。但是一个简单的函数指针不会。 – Tom

+0

好的,这样解释的话对我来说更有意义。我想这个问题应该是如何传递一个指向类函数的指针,明确指定哪个类实例没有明确指定类类型..?我现在只是困惑自己。 – Jarred