使用函数指针指向成员函数的问题
C++ - Issue of using function pointer to member function
我已经根据一些搜索应用了解决方案,但问题仍然存在。谢谢你的帮助。
error: must use '.*' or '->*' to call pointer-to-member function ...
源代码:#include <stdio.h>
class A
{
public:
struct data;
typedef int (A::*func_t)(data *);
typedef struct data
{
int i;
func_t func;
}
data;
data d;
void process()
{
d.func(&d);
}
A()
{
d.i = 999;
d.func = &A::print;
}
int print(data *d)
{
printf("%dn", d->i);
return 0;
}
};
int main()
{
A *a = new A;
a->process();
return 0;
}
d.func(&d);
是不够的。func
是一个成员函数指针,它指向A
的非静态成员。所以它可以在A
的对象上调用。所以你需要这样写:
(this->*(d.func))(&d);
只要你在A
里面写这个就可以了。
如果你想从外部执行func
,比如在main()
中,那么语法是:
A a;
(a.*(a.d.func))(&a.d);
你的process
函数试图调用d.func
,但它是一个指向成员函数的指针。指向成员函数的指针必须在某个对象上调用。假设您希望A
的实例是this
,在这种情况下,您的process
函数应该看起来像:
void process()
{
(this->*(d.func))(&d);
}
注意,当有指向成员函数的指针时,使用->*
操作符来调用成员函数
其他答案已经说您需要说(this->*d.func)(&d)
来调用成员指针函数(因为您需要提供对象,它是的成员)
另一个选择是使函数成为静态函数,它不需要特殊的语法来调用。要做到这一点,像这样改变类型定义:
typedef int (*func_t)(data *);
然后将print
函数设置为静态:
static int print(data *d)
{
...
}
现在你可以调用d.func(&d)
不幸的是,您要做的将是不可能的,原因是print
不是static
成员函数。这意味着它需要一个隐式的第一个参数,该参数是this
指针。
我建议你尝试使用std::function
和std::bind
函数,像这样:
class A
{
struct data
{
std::function<void(const data&)> func;
int i;
};
data d;
public:
A()
{
d.func = std::bind(&A::print, *this);
d.i = 999;
}
void process()
{
d.func(d);
}
void print(const data& my_data)
{
std::cout << my_data.i << 'n';
}
};
当然,由于
print
函数现在有一个正确的this
指针,您不再需要将数据结构传递给它:
class A
{
struct data
{
std::function<void()> func;
int i;
};
data d;
public:
A()
{
d.func = std::bind(&A::print, *this);
d.i = 999;
}
void process()
{
d.func();
}
void print()
{
std::cout << d.i << 'n';
}
};
调用指针成员要求它所属的类为this参数。
试题:
A a;
a.*(d.func)(&d);
相关文章:
- 如何使用指针传递给函数的数组中对象的函数成员
- c++构造函数成员初始化:传递参数
- 创建 std::函数,它返回具有函数成员值的变量.分段错误
- 如何在C++通过公共函数访问私有函数成员?
- 解释了构造函数成员初始化列表
- 调用std::函数成员时内存损坏
- 是否可以为模板类的模板函数成员设置别名?
- 捕获 lambda 函数C++成员变量
- 构造函数成员初始值设定项跨成员列出,安全吗?
- 获取与在模板参数中传递的函数成员类型相同的类
- 如何从公共函数成员访问地图私有成员
- C 构造函数成员分配优化
- 使用命名空间进行函数成员定义
- 函数成员作为 CUDA 内核的参数
- 模板基类函数成员的别名
- 函数成员中用于void和继承的enable_if
- 头文件中是否定义了一个很长的Class函数成员
- 类内/构造函数成员初始化
- 使用指向部分专用函数成员的指针自动填充向量
- 指向函数成员的指针