C++ 类成员函数作为参数

 1 #include <iostream>
 2 using namespace std;
 3
 4 typedef int int32_t;
 5
 6 struct IMsgBody{
 7     int body;
 8 };
 9
10 struct Arg{
11     int arg;
12 };
13
14 class A;
15
16 typedef int32_t (A::*GetArg_Fun)(IMsgBody *pMsgBody, Arg *stArg);    //函数指针
17
18 class A
19 {
20 public:
21     A(){}
22     ~A(){}
23     int32_t GetArg_GameEnd(IMsgBody *pMsgBody,Arg *stArg);
24     int32_t GetTaskArg(IMsgBody *pMsgBody,Arg *stArg,GetArg_Fun getArg_Fun);
25     int32_t GetTaskArg(IMsgBody *pMsgBody,Arg *stArg);
26 };
27
28 int32_t main()
29 {
30     IMsgBody msgBody;
31     Arg arg;
32     msgBody.body = 78;
33     arg.arg = 45;
34     A a;
35     a.GetTaskArg(&msgBody,&arg);
36     return 0;
37 }
38
39 int32_t A::GetArg_GameEnd(IMsgBody *pMsgBody,Arg *stArg)
40 {
41     cout<<"pMsgBody:"<<pMsgBody->body<<endl;
42     cout<<"Arg:"<<stArg->arg<<endl;
43     return 123;
44 }
45
46 int32_t A::GetTaskArg(IMsgBody *pMsgBody,Arg *stArg,GetArg_Fun getArg_Fun)
47 {
48     int ret = 0;
49     ret = (this->*getArg_Fun)(pMsgBody,stArg);
50     cout<<"ret = "<<ret<<endl;
51     return 0;
52 }
53
54 int32_t A::GetTaskArg(IMsgBody *pMsgBody,Arg *stArg)
55 {
56     GetTaskArg(pMsgBody,stArg,&A::GetArg_GameEnd);
57     return 0;
58 }
时间: 2024-10-29 19:06:36

C++ 类成员函数作为参数的相关文章

C++ 获取类成员函数地址方法 浅析

C语言中可以用函数地址直接调用函数: void print () { printf ("function print"); } typdef void (*fun)(); fun f = print; f(); C++中类非静态成员函数必须通过实例去调用,C++中类成员函数调用: class test { public: void print () { printf ("function print"); } }; 我们同样可以通过定义函数指针来调用如下: type

C++的const类成员函数

转自:http://blog.csdn.net/lihao21/article/details/8634876 我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, [cpp] view plain copy const char blank = ''; blank = '\n';  // 错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器

C++:类成员函数的重载、覆盖和隐藏区别?

#include <iostream> class A { public: void func() { std::cout << "Hello" << std::endl; } void func(int k) { } }; class B : public A { public: using A::func; // 把这句注释掉试试,嘿嘿 void func(int i) { } }; int main() { B b; b.func();//编译

【非原创】C++类成员函数的重载、覆盖和隐藏

链接:https://www.nowcoder.com/questionTerminal/266d3a6d4f1b436aabf1eff3156fed95来源:牛客网 题目:类成员函数的重载.覆盖和隐藏区别描述正确的有? A.覆盖是指在同一个类中名字相同,参数不同 B.重载是指派生类函数覆盖基类函数,函数相同,参数相同,基类函数必须有virtual关键字 C.派生类函数与基类函数相同,但是参数不同,会"隐藏"父类函数 D.函数名字相同,参数相同,基类无virtual关键字的派生类的函数

【转】C++的const类成员函数

我们知道,在C++中,若一个变量声明为const类型,则试图修改该变量的值的操作都被视编译错误.例如, const char blank=' '; blank='\n'; //错误 面向对象程序设计中,为了体现封装性,通常不允许直接修改类对象的数据成员.若要修改类对象,应调用公有成员函数来完成.为了保证const对象的常量性,编译器须区分不安全与安全的成员函数(即区分试图修改类对象与不修改类对象的函数).例如, const Screen blankScreen;  //Screen为class,

类成员函数可以为回调函数吗

关于类成员函数是否可以成为回调函数,我们首先需要明确几个定义,1. 什么是回调函数 2. 为什么要使用回调函数 3. 调用普通类成员函数和调用回调函数有什么区别 什么是回调函数? 简而言之,回调函数就是一个通过函数指针调用的函数,如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数 为什么要使用回调函数? 因为可以把调用者与被调用者分开.调用者不关心谁是被调用者,所有它需知道的,只是存在一个具有某种特定原型.某些限制条件(如返回值为int

直接调用类成员函数地址(用汇编取类成员函数的地址,各VS版本还有所不同)

在C++中,成员函数的指针是个比较特殊的东西.对普通的函数指针来说,可以视为一个地址,在需要的时候可以任意转换并直接调用.但对成员函数来说,常规类型转换是通不过编译的,调用的时候也必须采用特殊的语法.C++专门为成员指针准备了三个运算符: "::*"用于指针的声明,而"->*"和".*"用来调用指针指向的函数. // Thunk.cpp : Defines the entry point for the console applicatio

【C/C++学院】(8)全局函数和类成员函数转化/友元/操作符重载

1.全局函数和类成员函数转化 全局函数和成员函数的相互转化:只需要修改一个指向本类的this指针: #include <iostream> using namespace std; class Test { public: Test(int a, int b) { this->a = a; this->b = b; } //成员函数 Test &Gadd2(Test &t2) { this->a = this->a + t2.a; this->b

C++类成员函数

c++的两大特色是多态和模板.其中多态是通过继承和虚函数来实现的,其中虚函数是通过每个对象里面的虚表来实现的.如果这个对象的类有虚函数,那么这个类就有一张虚表,存的是每个虚函数的入口地址,而这个类的每个对象,都会有一个4字节的指针,指向这张虚表,这个就是虚指针. 上面一段话很多人都知道,但是如果问普通成员函数,编译器是怎么找到它的入口地址的呢?也就是说,怎么进行调用?为什么A类一个foo函数和B类一个foo函数,A类的对象.foo就一定是调用A的foo?有人会说运行时类型识别RTTI.假如识别出