特殊的C ++项目36

时间:2013-08-04 01:35:38

标签: c++ memory-management

我们正在阅读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 *和size_t)typedef的参数?

由于

3 个答案:

答案 0 :(得分:6)

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

例如

typedef int integral;
integral i = 1;

typedef void (B::*PMF)(void*, size_t);为类型声明别名PMF指向函数的指针(指向 void size_t )返回 void

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

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.

答案 1 :(得分:0)

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

答案 2 :(得分:0)

正如Borgleader已经指出的那样,typedef允许你引用具有B返回类型和两个参数的void类的成员函数:a {{1} }指针和void

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