c++ - 指向类成员的指针

标签 c++ function-pointers

在我的类(class)里,如果我想指向类(class)的成员,

struct S
{
     static int get();
     int do_something();
     int x;
};

我愿意,

int (*p)() = S::get;

不幸的是,这不适用于非静态成员

int (*p)() = S::do_something; // error

因为静态成员函数是一个普通函数,而且从我在下面引用的引文中可以看出,非静态成员函数也是一个普通函数,那么为什么它不起作用呢?这是什么意思?

(9.2/10) [Note: the type of a nonstatic member function is an ordinary function type, and the type of a nonstatic data member is an ordinary object type. There are no special member function types or data member types. ]

最佳答案

非静态成员函数不是普通函数。您不能形成指向它们的自由指针。

引用非静态成员函数的唯一允许方式是通过一对实例指针/引用和指向成员函数的指针:

S * p = &theobject;
int (S::*ptmf)() = &S::do_something;

return (p->*ptmf)();

不像成员对象(你可以很好地形成一个自由指针,例如&theobject.x),成员函数更复杂,因为你需要考虑虚函数:如果 S 是一个多态基类并且 p 是一个指向基的指针并且 do_something() 是虚函数,那么上面example 应该执行正确类型的调度。一个简单的自由函数指针无法做到这一点。

(此外,该标准没有指定成员函数的每个底层实现是如何实现的,所以这个细节永远不会暴露给用户。通常它会像 int S_mangled_name_do_something(S *) ;,但未指定。)

以下是我对这个主题的一些相关回答:#1 , #2 .

关于c++ - 指向类成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8277944/

相关文章:

c++ - 避免在 hpp 文件中暴露私有(private)成员变量

c++ - 在一个范围内生成无偏随机整数的最佳算法是什么?

C++ 错误 : expected constructor with declared header file

c - 传递函数指针 - 类型问题

c++ - 使用 boost 解析 xml

c++ - curl_easy_setopt(curl, CURLOPT_POSTFIELDS, msg_out);重复内存?

rust - 什么时候应该使用函数指针而不是闭包?

c++ - 是否可以将 C 风格的 api 回调/处理程序适应 C++ 以进行类相关的动态创建?

c++ - 使用另一个类的函数指针

c++ - 绑定(bind)成员函数