通过指针访问非静态 class 成员函数的说明
Clarification with accessing non-static class member function via pointer
我在从函数指针访问非静态成员函数时遇到困难,无法完全弄清楚我的语法问题。当尝试如下所示进行编译时,我收到 "error: fnc_ptr not declared in this scope." 并且当代码被修改为不访问该函数时,它应该指向它编译并为 bar.fn_ptr 打印出 1 。为了编译我使用了:
g++ -std=c++11 -Wall example.cpp foo.cpp
拆分文件 structure/namespace 只是为了模拟与我的原始问题相同的条件。
example.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;
}
foo.cpp
#include <cmath>
#include "foo.h"
namespace pizza{
double foo::fnc_one(double x){
return pow(x,3) - x + 2;
}
}
foo.h
namespace pizza{
class foo{
public:
double (foo::*fn_ptr)(double);
double fnc_one(double);
foo(){
fn_ptr = 0;
}
};
}
可以找到一个非常相似的问题 here, with additional reference here。
您在引用作为该对象属性的 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;
我在从函数指针访问非静态成员函数时遇到困难,无法完全弄清楚我的语法问题。当尝试如下所示进行编译时,我收到 "error: fnc_ptr not declared in this scope." 并且当代码被修改为不访问该函数时,它应该指向它编译并为 bar.fn_ptr 打印出 1 。为了编译我使用了:
g++ -std=c++11 -Wall example.cpp foo.cpp
拆分文件 structure/namespace 只是为了模拟与我的原始问题相同的条件。
example.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;
}
foo.cpp
#include <cmath>
#include "foo.h"
namespace pizza{
double foo::fnc_one(double x){
return pow(x,3) - x + 2;
}
}
foo.h
namespace pizza{
class foo{
public:
double (foo::*fn_ptr)(double);
double fnc_one(double);
foo(){
fn_ptr = 0;
}
};
}
可以找到一个非常相似的问题 here, with additional reference here。
您在引用作为该对象属性的 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;