【发布时间】:2014-10-29 14:55:23
【问题描述】:
我试图通过允许我选择不同形式的数学函数并通过将它们实例化为某个类的对象来改变它们的参数,从而在我的数字中实现更大的灵活性。该类包括我可以选择的某些数学函数以及我可以改变的参数。类的构造函数根据我想要的数学函数,将类中的成员函数指针设置为成员函数。我只想通过在我的例程中直接使用指针来调用它指向的任何函数。
然而,这被证明是令人生畏的,因为我不知道成员函数指针需要某种语法,而且根据我所能收集到的信息,它的工作方式似乎与常规函数指针有些不同。我已经做了很多实验,并为自己构建了一个下面共享的最小示例。
#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)()
这个特定的表达式导致我的编译器抱怨范围,如果我包含类范围,编译器会提到对非静态成员的无效使用。尽管如此,我还是很困惑为什么我的实现在这里不起作用,如果它起作用了,我的问题中的正确语法将如何以及为什么必须如此。
任何见解都将不胜感激。
【问题讨论】:
-
为什么要将字符串复制到 SomeClass 构造函数中?
-
我不太擅长使用字符串,所以我的想法是使用文字作为方法来告诉构造函数我希望函数指针指向哪个函数。这是否意味着某处的复制操作?
-
f(T x)按值传递 x,导致复制。如果函数不会修改字符串,请使用Someclass(const std::string& name)避免复制。 -
谢谢。将某些内容传递给函数时,我忘记了副本。将来会牢记这一点。