Ask the C++ Pro 10-Minute Solution(2)

原创 2003年12月02日 09:51:00
Ask the C++ Pro 10-Minute Solution
CSDN_Dev_Image_2003-11-301809541.gif

Pointing to Class Members

I've received a lot of questions lately such as this about pointers to class methods: "I work with Visual C++ 4.0. I cannot use the pointer of a class method. The compilation error message is:
Cannot convert parameter 2 from 'long (unsigned long)'
to 'long (__cdecl *)(unsigned long)'
What should I do?"

Here is the code for one way to solve this problem.

//in the header
class CKernel:
{
   long (*lpFunc)(DWORD);
   long OLESendTC( DWORD dwInfo );
}

//in the cpp File
BOOL CKernel::Init()
{
   lpFunc = OLESendTC;
   return TRUE;
}
Class methods all have one hidden argument, a pointer to the class object the method is called on. C++ uses this pointer to find the location of any class data that the method may reference. If you try and use a standard function pointer to call a class method, C++ has no way to pass this hidden argument and a conflict results.

To help deal with this and to improve type safety, C++ added three new operators, ::*, .*, and ->*, to allow for safe pointers to members. These pointers to members can point to either member functions or variables.

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 OLESENDTC/n";
	return 0;
}
This example shows one use of pointers to members. The code uses the ::* operator to declare lpFunc as a pointer to a CTest member function. Note that, rather than assign a value to this pointer at run time, the pointer is simply initialized in the declaration.

In the main function, this example uses the .* operator to call the method pointed to by lpFunc. If test were a pointer here, you would use the ->* operator instead.

C++ has a lot of things going on under the hood such as hidden arguments to methods. Pointers to members allow you to safely declare a pointer to a class method and call methods through that pointer.

三种数字调制的形式:ASK PSK FSK

数字调制的三种基本形式数字调制技术数字调制是指用数字数据调制模拟信号,主要有三种形式:移幅键控法ASK、移频键控法FSK、移相键控法PSK。幅度键控(ASK):即按载波的幅度受到数字数据的调制而取不同...
  • The_V_
  • The_V_
  • 2015年12月22日 17:24
  • 10464

Accelerated C++:通过示例进行编程实践——练习解答(第5章)

Accerated C++:Practical Programming by Example
  • u010066564
  • u010066564
  • 2014年10月15日 20:11
  • 1401

Pro ASP.NET Core MVC(二)【第一个MVC 应用程序】

学习一个软件开发框架的最好方法是跳进他的内部并使用它。在本章,你将用ASP.NET Core MVC创建一个简单的数据登录应用。我将它一步一步地展示,以便你能看清楚怎样构建一个MVC 应用程序。为了让...
  • WuLex
  • WuLex
  • 2017年05月20日 16:45
  • 1047

Visual Studio使用小技巧

1、vs常用工作环境配置 使用vs之前,需要进行一些常规的配置,以便更加方便自己的使用提高工作效率。字体应该配置为Consolas等宽字体,另外项背景色应设置为自定义淡蓝色(84,91,205),一说...
  • Arcsinsin
  • Arcsinsin
  • 2014年03月09日 15:48
  • 4652

hdu 5778 算复杂度

链接:戳这里 abs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Ja...
  • libin66
  • libin66
  • 2016年07月31日 20:47
  • 177

Visual Stuido (1): 跨项目调用 同一个solution下面不同project之间的方法调用

Visual Stuido (1): 跨项目调用 同一个solution下面不同project之间的方法调用: AnotherProject的配置Configuration Type是Dynamic ...
  • anyicheng2015
  • anyicheng2015
  • 2017年02月07日 07:16
  • 838

VS2010配置Pro*C/C++程序开发环境

由于一些很特殊的要求,
  • u012377333
  • u012377333
  • 2014年07月24日 17:15
  • 2135

关于redis集群的一些事

转自:http://www.th7.cn/db/nosql/201510/136294.shtml 一:关于redis cluster 1:   redis cluster的现状 r...
  • u012104999
  • u012104999
  • 2016年01月14日 18:46
  • 642

Pro*C/C++ 学习笔记(一)

一. Pro*C简介       关键字:Oracle 预编译工具 SQL语句和PLSQL块 高级编程语言       Oracle为应用开发人员所提供的许多预编译工具,如Pro*C,Pro*COLB...
  • dupu1
  • dupu1
  • 2014年01月11日 14:05
  • 669

C语言基础ask‖码一些知识

ask码的显示,以及个人经验分享,你想不通过任何软件工具就输出ASK里面的特殊符号吗?里面有讲~~~...
  • wenzhi20102321
  • wenzhi20102321
  • 2016年08月15日 11:17
  • 1542
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Ask the C++ Pro 10-Minute Solution(2)
举报原因:
原因补充:

(最多只允许输入30个字)