c++ - 函数指针(类内)

标签 c++ function class pointers methods

我正在尝试使用函数指针 (fnPtr) 从另一个类方法(在本例中为构造函数)中引用一个类方法 (fnEmpty) .

安装程序ma​​in.cpp

#include <iostream>
#include "test.hpp"

int main(int argc, char* argv[]){
    Test test;
    return 0;
}

和一个test.hpp

#ifndef _test_h
#define _test_h
#include <iostream>

class Test {
    private:

    public:
        void (*ptrEmpty)(void);
        void fnEmpty(){ std::cout << "Got Here" << std::endl;};
        Test(){ ptrEmpty = fnEmpty; };
        ~Test(){};
};

#endif

网络上的大部分资料都详细说明了能够从类外部(参见microsoft pagenewty.de)引用类方法,但不能从类内部(正如我所做的那样)。

使用上面的文件会报错

在 main.cpp:6 包含的文件中: ./test.hpp:11:21: 错误:必须调用对非静态成员函数的引用;

那么1) 为什么会出现这个错误?

如果我将第 10 行的 fnPtr 声明更改为 static,那么它会显示为

static void fnEmpty(){ std::cout << "Got Here" << std::endl;};

这似乎解决了问题。但这回避了问题2) 如果错误说只允许“非静态”,为什么它接受“静态”?

如果我删除 static 而不是更改第 11 行(通过添加 &),它会显示为

        Test(){ ptrEmpty = &fnEmpty; };

我得到了一个全新的错误信息

./test.hpp:11:21: error: must explicitly qualify name of member function when taking its address

不幸的是替换为

        Test(){ Test::ptrEmpty = Test::&fnEmpty; };

或者像上面给出的链接中所做的那样不包括 Test:: 前缀的变体不能解决问题。

我的印象是,就函数指针而言,在引用函数时(例如 fn),

ptr = fn;

相当于

ptr = &fn;

3) 那么,当我包含和排除“&”时,为什么会出现两组不同的错误

所以我的最终问题是::

4) 指向类方法的正确方法是什么(从同一类的不同方法中)?当它在同一个类中时,我是否需要包含“Classname::”限定符?

谢谢, 杰夫

最佳答案

fnEmpty 是一个非静态成员函数,这意味着它有一个隐式的第一个参数,一个指向调用它的 Test 实例的指针(这个指针)。所以指向该成员函数的指针的类型是

void (Test::*ptrEmpty)();

接下来,要形成指向成员函数的指针,您需要使用语法 &ClassName::MemFnName 因此,在您的构造函数中

ptrEmpty = &Test::fnEmpty;

现在您的示例应该可以编译了。您可以使用

调用ptrEmpty 指向的函数
Test t;
(t.*(t.ptrEmpty))();

当您将 fnEmpty 更改为 static 时,它不再接收隐式的 this 指针参数,因此它就像任何其他指向函数的指针一样, 你的代码编译。

关于c++ - 函数指针(类内),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30228452/

相关文章:

c++ - 什么是 operator class_name() 常量?

c++ - 如何确定 C 中的处理器字长?

c++ - 通用观察者模式

c++ - wxWidgets 3.1.5 MSW - HiDPI 缩放问题导致控件大小不正确

c - 删除 c 中的前导零

javascript - 使用 JS 而不是 PHP 执行 Script 标签

javascript - 仅在自定义函数完成 jQuery 后运行函数

java - 调用另一个类中的方法并存储返回的列表

java - 说关键字 "private"在类级别是私有(private)的是什么意思?

arrays - Ruby:禁止更新作为类变量的数组