将指向 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(); }};
我正在尝试将指向 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(); }};