翻过高山走不出你
如何获得类成员函数的函数指针,然后使用特定对象调用该成员函数?最简单的方法是从typedef..对于成员函数,可以在类型声明中添加类名:typedef void(Dog::*BarkFunction)(void);然后,要调用该方法,请使用->*操作员:(pDog->*pBark)();此外,如果可能的话,我也希望通过指针调用构造函数。这是可能的吗?如果可能的话,最好的方法是什么?我不相信你能和这样的构造器一起工作-函数和函数是特别的。实现这类任务的正常方法是使用工厂方法,它基本上只是一个静态函数,它为您调用构造函数。有关示例,请参阅下面的代码。我已经修改了你的代码来做你所描述的。下面有一些警告。#include class Animal{public:
typedef Animal*(*NewAnimalFunction)(void);
virtual void makeNoise()
{
std::cout <
}};class Dog : public Animal{public:
typedef void(Dog::*BarkFunction)(void);
typedef Dog*(*NewDogFunction)(void);
Dog () {}
static Dog* newDog()
{
return new Dog;
}
virtual void makeNoise ()
{
std::cout <
}};int main(int argc, char* argv[]){
// Call member function via method pointer
Dog* pDog = new Dog ();
Dog::BarkFunction pBark = &Dog::makeNoise;
(pDog->*pBark)();
// Construct instance via factory method
Dog::NewDogFunction pNew = &Dog::newDog;
Animal* pAnimal = (*pNew)();
pAnimal->makeNoise();
return 0;}现在,尽管您通常可以使用Dog*代替Animal*由于多态的魔力,函数指针的类型不遵循类层次结构的查找规则。因此,动物方法指针与Dog方法指针不兼容,换句话说,您不能分配Dog* (*)()类型变量Animal* (*)().静电newDog方法是一个工厂的简单示例,它简单地创建并返回新实例。作为一个静态函数,它有一个正则函数。typedef(没有类限定符)。在回答了上述问题后,我想知道是否没有更好的方法来达到你所需要的。有一些特定的场景,您可以这样做,但您可能会发现,还有其他模式更适合您的问题。如果你用更笼统的语言来描述你想要达到的目标,蜂巢思维可能会更有用!与上述相关,您无疑会发现升压绑定库和其他相关模块非常有用。