gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 00:32:52 24 4
gpt4 key购买 nike

我正在尝试使用函数指针 (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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com