这种用于将类型添加到称为类的 C++ 技术是什么?

What is this C++ technique for adding types to a class called?

提问人:Charles Anderson 提问时间:10/29/2009 更新时间:10/29/2009 访问量:281

问:

我刚刚找到了一些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 年中,我从未遇到过它,并希望结束我的无知。

C++(英语:C++) 派生类型

评论

0赞 sellibitze 10/29/2009
“向现有类添加类型”是什么意思?另外,您能否指出代码的哪一部分“向现有类添加类型”?我所看到的只是使用指向成员的指针。
0赞 Charles Anderson 10/30/2009
我向您推荐注释 // 定义派生类型 pmfn 和 pmd。以及 ATestpm.*pmd = 1 等行;这表明“pmd”已添加到类 Testpm 中。这些就是我提出问题的原因,也是我措辞的方式。现在查看代码,并受益于目前提供的答案,我可以看到 pmd 和 pmfn 被定义为指向 Testpm 内部成员的指针。事实上,它们是指向类而不是对象的指针,以及从 Testpm 对象访问它们的方式,这让我感到困惑,因为我不记得以前见过这种情况。
1赞 Martin York 10/30/2009
它们是指向类成员的指针。 'pmfn':是指向成员函数的指针,'pmd':是指向成员数据的指针。这些概念在 STL 的算法中被大量使用,尽管这不会向 STL 的用户公开。

答:

4赞 pxb 10/29/2009 #1

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

从这个网站这里

关于它们的语法,有两个 不同类型的函数指针: 一方面,有指向 普通C函数或静态C++ 成员函数。另一方面 有指向非静态 C++ 的指针 成员函数。基本区别 是所有指向非静态的指针 成员函数需要隐藏 argument:指向 类的实例。始终保持 mind:这两类功能 指针与每个指针不兼容 其他。

评论

0赞 user200783 10/29/2009
事实上,他们甚至没有定义指针的类型,而是自己定义指针。
0赞 pxb 10/29/2009
我纠正了,他们没有定义指针的类型,只是创建它们的实例并使用它们。我责怪睡眠不足......
6赞 user200783 10/29/2009 #2

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

评论

1赞 sbi 10/29/2009
难以置信,但事实是:即使是指向成员的指针也是类型。
0赞 user200783 10/29/2009
“是类型”,还是“有类型”?如果我写了 typedef int Testpm::*pmd_t = &Testpm::m_num;pmd_t PMD;显然pmd_t是一种类型,但您的意思是 PMD 也是一种类型吗?第二种情况适用于问题中的代码。
1赞 Johannes Schaub - litb 10/29/2009
看起来他们放了 ,然后删除了它,忘记更改评论。事实上,在C++中所谓的“复合类型”在C中被称为“派生类型”,因此我相信代码中的注释。typedef