我试图通过允许我选择不同形式的数学函数并通过将它们实例化为某个类的对象来改变它们的参数来实现我的数值中更多的灵活性。该课程包括我可以选择的某些数学函数以及可以改变的参数。根据我想要的数学函数,该类的构造函数将类中的成员函数指针设置为成员函数。我想单独使用指针,通过直接在我的例程中使用指针来调用它指向的任何函数。C++:如何调用是同一类的成员的成员函数指针?
但是,这证明令人生畏,因为我不知道成员函数指针需要某种语法,并且根据我可以收集的内容似乎与常规函数指针有点不同。我已经尝试了很多,并为自己构建了一个下面分享的最简单的例子。
#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);
}
这表明,我可以使用,只是通过使用该指针调用的任何指针指向另一个成员函数的访问指针。但是,我似乎仍不能得到函数调用,如果我尝试在我的主要功能,通过线直接使用指针工作,
(someobject.*fptr)()
这种特殊的表达导致我的编译器抱怨的范围和如果我包含类作用域,编译器会提到非静态成员的无效使用。不过,我很困惑,为什么我的实现在这里不起作用,如果它的确如此,那么我的问题中的正确语法将是什么以及为什么会如此。
任何见解将非常感激。
为什么你的字符串复制到SomeClass的构造函数? – 2014-10-29 15:01:35
我不擅长使用字符串,所以我的想法是使用文字作为方法来告诉构造函数我希望函数指针指向哪个函数。这是否意味着复制操作在某个地方? – featherbrain 2014-10-29 15:12:57
'f(T x)'按值传递x,导致复制。如果函数不修改字符串,使用'Someclass(const std :: string&name)'来避免复制。 – 2014-10-29 15:21:02