类的成员函数指针的使用方法

本文详细介绍了如何在C++中使用类的成员函数指针,并通过具体实例展示了如何在一个类中设置和调用另一个类的成员函数。这种方法在多线程编程等场景中十分有用。

      函数指针主要的目的是实现与运用相互分离,类的成员函数封装在类里面,运行需要相应的对象来调用,所以在调用这个类的成员函数时候,需要类的函数地址和这个类的对象。

    以下是实现的类:

    class A
    {
    public:
void DoSth()
{
printf("A-DoSth");
}
    };

   以下是调用的类:

    typedef void (A::*PFun)(void);//声明类的函数指针


    class B
    {
    public:
     B(void):pA(NULL),pFun(NULL)
     {
     }


   ~B(void)

           {

           }

  void SetAddr(A* pA,PFun pAddr)
  {
  this->pA = pA;
  pFun = pAddr;
  }


  void RunFun()
          {
if(pA&&pFun)
 (pA->*pFun)();
  }
   private:
A* pA;
PFun pFun;
   };

  

以下是综合使用部分:

        A a;
B b;

       PFun pAddr = &A::DoSth;//类的成员函数地址

       b.SetAddr(&a,pAddr);

       b.RunFun();

总结:

使用函数指针多数在多线程里。


参考:

高质量程序设计指南-C++/C 语言

<think> 首先,用户的问题是关于C++成员函数指针使用方法。我需要根据提供的引用内容来回答。 回顾引用内容: - 引用[1]:展示了成员函数指针的定义和使用,包括如何通过对象和指针调用成员函数。 - 引用[2]:解释了C++中成员函数指针与C语言函数指针的区别,强调不能像C那样直接使用。 - 引用[3]:给出了一个例子,定义了成员函数指针,并展示了如何调用。 - 引用[4]:讨论了静态成员函数指针和普通函数指针的区别,展示了一个静态成员函数的例子。 - 引用[5]:提到了将成员函数指针转换为C风格指针方法。 用户的具体查询是:“请问C++成员函数指针使用方法”,所以我需要综合这些信息,提供一个清晰、结构化的回答。 根据系统指令: - 所有行内数学表达式使用$...$格式,但这个问题中没有数学表达式,所以可能不需要。 - 独立公式使用$$...$$,但这里无关。 - LaTeX语法正确:需要确保代码块正确。 - 使用中文回答。 - 生成相关问题:在回答后添加相关问题。 - 回答中引用的段落末尾添加引用标识:[^n] 回答结构: 1. **介绍成员函数指针**:解释成员函数指针是什么,以及与普通函数指针的区别。 2. **定义成员函数指针**:展示如何定义一个成员函数指针。 3. **使用成员函数指针**:通过例子展示如何调用成员函数指针,包括对象和指针的情况。 4. **静态成员函数指针**:区分静态成员函数指针的特殊性。 5. **注意事项**:提到C风格转换,如引用[5]所述。 代码示例:从引用中提取相关代码示例,并确保正确格式化。 相关问题生成:在最后添加2-3个相关问题。 确保回答真实可靠:基于提供的引用,不要添加额外信息。 大纲回答: - 开头:简述成员函数指针的概念。 - 定义部分:展示定义语法。 - 使用部分:展示调用语法。 - 静态与非静态的区别。 - 代码示例。 - 结束语。 - 相关问题。 添加引用标识:在相关句子末尾添加[^n]。 例如: - 根据引用[1],成员函数指针调用时需要使用对象或指针[^1]。 - 引用[4]指出静态成员函数指针似于普通函数指针[^4]。 相关问题: 1. 如何将成员函数指针转换为C风格函数指针? 2. 成员函数指针有哪些应用场景? 3. 在C++11或更高版本中,如何使用lambda或std::function替代成员函数指针? 现在,构建回答。 </think> 以下是关于C++成员函数指针使用方法的详细解释。基于您提供的引用内容,我会一步步说明成员函数指针的定义、使用方法、以及关键注意事项。成员函数指针是指向成员函数指针,与非静态成员函数绑定,调用时需要指定对象(因为成员函数隐含了`this`指针)。这与静态成员函数或普通函数指针不同,后者不需要对象实例[^2][^4]。 ### 1. **成员函数指针的定义** 成员函数指针的定义语法为: ```cpp 返回型 (名::*指针变量名)(参数列表); ``` 例如: ```cpp class MyClass { public: void func(int param) { /* ... */ } // 非静态成员函数 }; void (MyClass::*pFunc)(int) = &MyClass::func; // 定义成员函数指针 ``` - 这里`pFunc`指向`MyClass`的成员函数`func`。 - **注意**:必须使用`&名::函数名`获取地址,不能像普通函数那样省略`&`[^3]。 ### 2. **成员函数指针使用** 调用成员函数指针时,必须通过对象或对象指针来绑定`this`指针。语法取决于对象型: - **通过普通对象调用**:使用`(对象.*指针名)(参数)` - **通过对象指针调用**:使用`(对象指针->*指针名)(参数)` 示例代码(基于引用[1]和[3]): ```cpp #include <iostream> using namespace std; class Test { public: void show(int value) { cout << "Value: " << value << endl; } }; int main() { // 定义成员函数指针 void (Test::*pShow)(int) = &Test::show; // 通过普通对象调用 Test testObj; (testObj.*pShow)(10); // 输出: Value: 10 // 通过对象指针调用 Test* pTest = new Test(); (pTest->*pShow)(20); // 输出: Value: 20 delete pTest; return 0; } ``` - 在这个例子中,`(testObj.*pShow)(10)`和`(pTest->*pShow)(20)`确保成员函数操作正确的对象数据[^1][^3]。 ### 3. **静态成员函数指针的特殊性** 静态成员函数(`static`修饰)不依赖对象实例,其指针使用方式与普通函数指针相同: ```cpp class Math { public: static int add(int a, int b) { return a + b; } }; int main() { // 定义静态成员函数指针似普通函数指针) int (*pAdd)(int, int) = &Math::add; // 直接调用,无需对象 int result = pAdd(3, 4); // 结果: 7 cout << "Result: " << result << endl; return 0; } ``` - **关键区别**:非静态成员函数需要`this`指针,而静态成员函数没有隐含对象上下文,因此指针用法更简单[^4]。 ### 4. **注意事项和常见错误** - **错误处理**:如果尝试像C语言那样直接调用非静态成员函数指针(如`pShow(10)`),编译器会报错:`reference to non-static member function must be called`,因为缺少对象绑定[^2]。 - **转换为C风格指针**:如果需要将成员函数指针传递给C API,可以使用包装(如`CallbackWrapper`)或C++17的`inline static`特性来转换[^5]。 - **适用场景**:成员函数指针常用于回调机制、事件处理或实现多态行为。 ### 总结 成员函数指针的核心在于绑定对象:非静态成员函数指针必须通过`.*`或`->*`运算符调用,而静态成员函数指针等同于普通函数指针。确保语法正确以避免常见错误[^1][^2][^4]。练习时可以从简单例子开始,逐步扩展到回调设计模式。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值