我试图通过允许我选择不同形式的数学函数并通过将它们实例化为某个类的对象来改变它们的参数,从而在我的数字中实现更多的灵活性。该类包括我可能选择的某些数学函数以及我可以改变的参数。该类的构造函数根据我想要的数学函数将类中的成员函数指针设置为成员函数。我想通过直接使用我的例程中的指针来单独使用指针调用它指向的任何函数。
然而,事实证明这是令人生畏的,因为我不知道成员函数指针需要某种语法,并且根据我可以收集的内容,它似乎与常规函数指针有些不同。我已经进行了相当多的实验,并构建了一个在下面分享的最小例子。
#include<iostream>
#include<string.h>
#include<cstdlib>
#include<stdio.h>
class Someclass
{
public:
// constructor to set pointer
Someclass(std::string);
// member function pointer to hold functions
void (Someclass::*fptr)();
// auxiliary function to call testfunction via pointer
void call ();
// testfunction
void foo();
};
// testfunction
void Someclass::foo()
{
printf("foo says hi! \n");
}
// call via specific function
void Someclass::call()
{
(this->*fptr)();
}
// constructor
Someclass::Someclass(std::string name)
{
if(name=="foo")
{
this->fptr = &Someclass::foo;
}
}
int main()
{
Someclass someobject("foo");
someobject.foo(); // direct testfunction call: Works OK
someobject.call(); // call via auxiliary function: Works OK
//(someobject.*fptr)(); // direct pointer dereferencing: Gives Error
return(EXIT_SUCCESS);
}
它表明我可以通过使用另一个成员函数来访问指针,该函数只通过使用this指针调用指针指向的任何内容。但是,如果我尝试通过直接在主函数中直接使用指针,我仍然无法使函数调用工作,
(someobject.*fptr)()
这个特殊的表达式导致我的编译器抱怨范围,如果我包含类范围,编译器会提到无效使用非静态成员。尽管如此,我仍然很困惑为什么我的实现在这里不起作用,如果确实如此,我的问题中的正确语法将如何以及为什么必须如此。
任何见解都会非常感激。
答案 0 :(得分:1)
fptr
是对象的成员,而不是main
的本地变量。在这方面,成员函数指针的行为与所有其他变量类型完全相同。你是如此接近,只需要使用对象名称限定函数指针名称:
(someobject.*(someobject.fptr))();
答案 1 :(得分:0)
原因是.*
表示指向成员函数的指针,并不直接引用像.
和.->
运算符这样的对象的成员。由于fptr
是Someclass
的成员而不是本地变量,因此您需要直接引用它
(someobject.*someobject.fptr)();