提问人:Charles Anderson 提问时间:10/29/2009 更新时间:10/29/2009 访问量:281
这种用于将类型添加到称为类的 C++ 技术是什么?
What is this C++ technique for adding types to a class called?
问:
我刚刚找到了一些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赞
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
评论