【问题标题】:C++: How to call a member function pointer that is a member of the same class?C ++:如何调用属于同一类的成员的成员函数指针?
【发布时间】: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&amp; name) 避免复制。
  • 谢谢。将某些内容传递给函数时,我忘记了副本。将来会牢记这一点。

标签: c++ class pointers syntax


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    原因是.* 表示指向成员函数的指针,并不像..-&gt; 运算符那样直接引用对象的成员。由于fptrSomeclass 的成员而不是局部变量,因此您需要像这样直接引用它

    (someobject.*someobject.fptr)();
    

    【讨论】:

    • 嗯,这很快。它就像一个魅力。非常感谢! .* 与单独使用每个运算符完全不同的解释是我所缺少的。
    猜你喜欢
    • 2014-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-02
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多