4

我刚刚找到了一些 C++ 代码(位于http://msdn.microsoft.com/en-us/library/k8336763(VS.71).aspx),它使用了一种我以前从未见过的技术来添加类型一个现有的类:

class Testpm {
public:
   void m_func1() { cout << "m_func1\n"; }
   int m_num;
};

// Define derived types pmfn and pmd.
// These types are pointers to members m_func1() and m_num, respectively.
void (Testpm::*pmfn)() = &Testpm::m_func1;
int Testpm::*pmd = &Testpm::m_num;

int main() {
   Testpm ATestpm;
   Testpm *pTestpm = new Testpm;

   // Access the member function
   (ATestpm.*pmfn)();
   (pTestpm->*pmfn)();   // Parentheses required since * binds

   // Access the member data
   ATestpm.*pmd = 1;
   pTestpm->*pmd = 2;

   cout  << ATestpm.*pmd << endl
         << pTestpm->*pmd << endl;
}

有人可以告诉我这种定义派生类型的技术叫什么,或者给我一些关于它的文档吗?我在使用 C++ 的 13 年中从未遇到过它,我想结束我的无知。

4

2 回答 2

6

评论不正确:pmfn 和 pmd 根本不是“派生类型”(它们甚至不是类型!)。它们是指向成员的指针。

于 2009-10-29T12:07:54.013 回答
4

我不认为他们在课堂上“添加类型”。他们似乎只是定义了指向类的成员函数和成员数据的指针类型,然后使用它们来访问成员函数和数据成员。类似于您将类型声明为非成员函数的方式,但作为类的成员,语法有所不同。

从这个网站这里

关于它们的语法,有两种不同类型的函数指针:一种是指向普通 C 函数或指向静态 C++ 成员函数的指针。另一方面,有指向非静态 C++ 成员函数的指针。基本区别在于所有指向非静态成员函数的指针都需要一个隐藏参数:指向类实例的 this 指针。永远记住:这两种类型的函数指针彼此不兼容。

于 2009-10-29T12:03:54.410 回答