说明通过指针访问非静态类成员函数

Clarification with accessing non-static class member function via pointer

本文关键字:静态类 成员 函数 访问 指针 说明      更新时间:2023-10-16

我很难从函数指针访问非静态成员函数,并且无法完全弄清楚我的语法问题。尝试如下图所示进行编译时,我收到"错误:fnc_ptr未在此范围内声明",如果代码被修改为无法访问该函数,它应该指向它编译并将打印出 1 用于bar.fn_ptr。为了编译,我使用了:

g++ -std=c++11 -Wall example.cpp foo.cpp

拆分文件结构/命名空间只是为了模拟与我的原始问题相同的条件。

示例.cpp

#include "foo.h"
#include <iostream>
int main(int argc, char* argv[]){
pizza::foo bar;
bar.fn_ptr = &pizza::foo::fnc_one;
std::cout << (bar.*fn_ptr)(1) << std::endl;
return 0;
}

傅.cpp

#include <cmath>
#include "foo.h"
namespace pizza{
double foo::fnc_one(double x){
return pow(x,3) - x + 2;
}
}

福.H

namespace pizza{
class foo{
public:
double (foo::*fn_ptr)(double);
double fnc_one(double);
foo(){
fn_ptr = 0;
}
};
}

一个非常相似的问题可以在这里找到,其他参考在这里。

在引用fn_ptr该对象的属性时,您缺少bar.。将其更改为:

std::cout << (bar.*(bar.fn_ptr))(1) << std::endl;

它有效。

我还建议您阅读有关该主题的常见问题解答:https://isocpp.org/wiki/faq/pointers-to-members

我相信正确的语法是:

//std::cout << (bar.*fn_ptr)(1) << std::endl;
std::cout << (bar.*(bar.fn_ptr))(1) << std::endl;