指向类成员

2016-01-29 12:26 1 1 收藏

指向类成员,指向类成员

【 tulaoshi.com - C语言心得技巧 】

指向类成员

作者:Danny Kalev
编译:MTT 工作室

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

原文出处:Pointing to Class Members

摘要:本文讲述类成员指针的内部机制以及它的一般使用方法......

  最近我收到许多有关类方法指针的问题,比如:在 VC 中无法使用类方法指针,编译器报如下错误:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)
Cannot convert parameter 2 from ''long (unsigned long)''to''long (__cdecl *)(unsigned long)''

我该怎么办?

下面是解决这个问题的代码:

//in the headerclass CKernel:{long (*lpFunc)(DWORD);long OLESendTC( DWORD dwInfo );}//in the cpp FileBOOL CKernel::Init(){lpFunc = OLESendTC;return TRUE;}      
  大家知道,类成员都有一个隐含的参数,即类对象本身的一个指针,其方法都是这个对象上调用的。C++ 使用该指针查找任何方法拟引用的类数据的位置。如果你想尝试用标准函数指针来调用某个类的方法,C++ 便无法传递此隐含的参数,并且要引发冲突。
  为了解决这个问题并改进类型安全机制,C++ 添加了三个新操作符,::*、.* 和-,以便引入安全的成员指针。这些成员指针既可以指向成员函数,也可以指向变量。
class CTest{public:BOOL Init();long OLESendTC(DWORD dwInfo);};long (CTest::*lpFunc)(DWORD dwInfo) = &CTest::OLESendTC;int main(){CTest test;(test.*lpFunc)(0);return 0;}long CTest::OLESendTC(DWORD dwInfo){cout << "IN OLESENDTCn";return 0;}      
  这个例子示范了成员指针的使用。代码用::*操作符将 lpFunc 声明为一个 CTest 成员函数的指针。注意,这里并不是在运行时赋值给这个指针,该指针在声明中被初始化。在 main 函数中,此例子用 .* 操作符来调用由 lpFunc 指向的方法。如果这里 test 是一个指针,你将用 -* 操作符代替。
  C++ 有许多像隐藏方法参数这样的内部机制。成员指针使你能安全地声明类方法指针并通过该指针来调用方法。
 
作者简介
  Danny Kalev 是一名通过认证的系统分析师,专攻 C++ 和形式语言理论的软件工程师。1997 年到 2000 年期间,他是 C++ 标准委员会成员。最近他以优异成绩完成了他在普通语言学研究方面的硕士论文。 业余时间他喜欢听古典音乐,阅读维多利亚时期的文学作品,研究 Hittite、Basque 和 Irish Gaelic 这样的自然语言。其它兴趣包括考古和地理。Danny 时常到一些 C++ 论坛并定期为不同的 C++ 网站和杂志撰写文章。他还在教育机构讲授程序设计语言和应用语言课程。

来源:https://www.tulaoshi.com/n/20160129/1486049.html

延伸阅读
今天在CSDN论坛里面游逛,发现这样的一个帖子《刚才看到一位武林高手的几行精妙代码,百思不得其解,希望各位指点》,本着向各大武林高手学习的态度,我看完了整个帖子,发现内容甚为经典,记录于此,作个总结:   type   TStringGridEx = class(TStringGrid); procedure TForm1.Button1Click(Sen...
标签: flash教程
AS2.0和JAVA.C#一样.也运用OOP模式.哪它一定就有继承.子类父类超类的分别.学过 JAVA,C#的人很快就能理解. 这里说的类继承指一个class类能够继承另一个class类的全部方法和属性.在说AS2.O的 类继承方法前.先说一下什么是.private(私有性成员)和public(公有性成员) AS2.0建立在class中的所有变量,方法,属性默认都是公有性的.我们当然也可以定义...
C++中类的数据成员的安全隐患 作者:周云才 (江汉石油学院计算机科学系 邮编 4340023)     在任何一本关于"C++语言程序设计"的书中都有类似于如下的描述:     在一个类中,C++用三个关键词设置访问界限:public, private和protect...
标签: Web开发
JavaScript静态成员的定义,只需要在类的构造函数之外,使用类的名称(即:构造函数的函数名称)来定义,如: function MyClass(){} MyClass.staticMethod = staticMethod; function staticMethod(){} JavaScript的静态成员变量的定义类似,如: MyClass.STATIC_VAR = "SHIRDRN"; 下面通过编写一个实例来说明,如下所示: scr...
一个指针变量可以指向整型变量、实型变量、字符类型变量,当然也可以指向指针类型变量。当这种指针变量用于指向指针类型变量时,我们称之为指向指针的指针变量,这话可能会感到有些绕口,但你想到一个指针变量的地址就是指向该变量的指针时;这种双重指针的含义就轻易理解了。下面用一些图来描述这种双重指针,见图6-13。 在图中,整...

经验教程

297

收藏

29
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部