【问题标题】:What is this C++ technique for adding types to a class called?将类型添加到名为的类的这种 C++ 技术是什么?
【发布时间】:2010-12-11 05:18:33
【问题描述】:

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

【问题讨论】:

  • “将类型添加到现有类”是什么意思?另外,您能否指出代码的哪一部分“将类型添加到现有类”?我所看到的只是使用指向成员的指针。
  • 我请你参考评论 // 定义派生类型 pmfn 和 pmd。以及诸如 ATestpm.*pmd = 1 之类的行;这表明“pmd”已添加到类 Testpm 中。这些是促使我提出问题的原因,也是我的措辞方式。现在查看代码,借助目前提供的答案,我可以看到 pmd 和 pmfn 被定义为指向 Testpm 内部成员的指针。事实上,它们是指向类而不是对象的指针,以及可以从 Testpm 对象访问它们的方式,这让我感到困惑,因为我不记得以前见过这种情况。
  • 它们是指向类成员的指针。 'pmfn':指向成员函数的指针,'pmd':指向成员数据的指针。这些概念在 STL 的算法中被大量使用,尽管这些概念并未暴露给 STL 的用户。

标签: c++ derived-types


【解决方案1】:

评论不正确:pmfn 和 pmd 根本不是“派生类型”(它们甚至都不是类型!)。他们是pointers to members

【讨论】:

  • 难以置信,但事实如此:即使指向成员的指针也是类型。
  • “是类型”还是“有类型”?如果我写 typedef int Testpm::*pmd_t = &Testpm::m_num; pmd_t pmd;显然 pmd_t 是一种类型,但你的意思是 pmd 也是一种类型吗?第二种情况适用于问题中的代码。
  • 貌似他们放了typedef,然后又删除了,忘记改评论了。实际上,C++中所谓的“复合类型”在C中称为“派生类型”,因此我相信代码中的注释。
【解决方案2】:

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

来自这个网站here

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

【讨论】:

  • 事实上他们甚至没有定义指针的类型——他们自己定义了指针。
  • 我的立场是正确的,他们没有为指针定义类型,只是创建它们的实例并使用它们。我责怪睡眠不足......
猜你喜欢
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
相关资源
最近更新 更多