2014-10-29 61 views
2

我试图通过允许我选择不同形式的数学函数并通过将它们实例化为某个类的对象来改变它们的参数来实现我的数值中更多的灵活性。该课程包括我可以选择的某些数学函数以及可以改变的参数。根据我想要的数学函数,该类的构造函数将类中的成员函数指针设置为成员函数。我想单独使用指针,通过直接在我的例程中使用指针来调用它指向的任何函数。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)() 

这种特殊的表达导致我的编译器抱怨的范围和如果我包含类作用域,编译器会提到非静态成员的无效使用。不过,我很困惑,为什么我的实现在这里不起作用,如果它的确如此,那么我的问题中的正确语法将是什么以及为什么会如此。

任何见解将非常感激。

+0

为什么你的字符串复制到SomeClass的构造函数? – 2014-10-29 15:01:35

+0

我不擅长使用字符串,所以我的想法是使用文字作为方法来告诉构造函数我希望函数指针指向哪个函数。这是否意味着复制操作在某个地方? – featherbrain 2014-10-29 15:12:57

+0

'f(T x)'按值传递x,导致复制。如果函数不修改字符串,使用'Someclass(const std :: string&name)'来避免复制。 – 2014-10-29 15:21:02

回答

0

原因是.*表示指向成员函数的指针,并且不直接引用像..->运算符这样的对象的成员。由于fptrSomeclass一员,而不是你需要直接引用它像这样

(someobject.*someobject.fptr)(); 
+0

那很快。它就像一个魅力。非常感谢! 。*的解释与单独使用每个操作符完全不同的是我错过了。 – featherbrain 2014-10-29 15:08:48

1

fptr一个局部变量是对象的成员,而不是一个局部变量main。在这方面,成员函数指针的行为与所有其他变量类型完全相同。你是如此接近,只是需要与对象名称来限定函数指针名称:

(someobject.*(someobject.fptr))();

+0

也非常感谢你!这个问题一直困扰我整整一天... – featherbrain 2014-10-29 15:10:48