2

作为课堂作业的一部分,我们正在阅读 Herb Sutter 的 Exceptional C++ 书籍。

我在理解 typedef 实际在做什么和破译它是如何构造的方面有一个问题:第 36 条:

如果有人通过 typefef 的逻辑,这将是一个很大的帮助。

class B
{
public:
   virtual ~B();
   void operator delete (void*, size_t) throw();
   void operator delete[] (void*, size_t) throw();
   void f(void*, size_t) throw();
}
class D : public B
{
public:
   void operator delete (void*) throw();
   void operator delete[] (void*) throw();
};

typedef void (B::*PMF)(void*, size_t);
PMF p1 = &B::f;
PMF p2 = &B::operator delete;

由于 B 类 (PMF) 中没有指向成员函数的指针,那么 PMF 是什么以及它是如何创建的?

typedef的返回类型是void吗?(void* and size_t) 是 typedef 的参数吗?

谢谢

4

3 回答 3

6

typedef关键字声明现有类型的别名。

例如

typedef int integral;
integral i = 1;

该行typedef void (B::*PMF)(void*, size_t);声明了一个类型的别名PMF指向函数的指针(即采用指向 void 和的指针 size_t)返回 void

有关如何使用螺旋规则从复杂声明中解释类型的详细说明,请参阅此链接:顺时针/螺旋规则

PMF是类型的别名。它可用于声明指向 B 的成员且具有相同参数列表和返回类型的任何函数的指针。

PMF p1 = &B::f; // Declare p1 as a PMF and set it to point to address of B::f.
B b; // Create instance of B (needed as p1 points to a member function).
(b.*p1)(nullptr, 0); // Here p1 can be used as if it was a call to B::f.
于 2013-08-04T01:52:46.380 回答
0

正如评论中已经解释的那样,PMB 是指向 B 的成员函数的指针,该函数采用给定的参数列表。它是新类型的名称——它不对应于 B 类本身的任何内容。

于 2013-08-04T01:47:30.550 回答
0

正如 Borgleader 已经指出的那样,typedef允许您引用B具有void返回类型和两个参数的类的成员函数:一个void指针和一个size_t.

我很确定 PMF 是公共成员函数的首字母缩写词......

于 2013-08-04T01:48:10.680 回答