【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2053|回复: 2

函数指针碰到点问题。请大家指点下具体的解决方案。

[复制链接]
发表于 2012-8-16 21:04:12 | 显示全部楼层 |阅读模式
本帖最后由 夜行的猫仔 于 2012-8-16 21:06 编辑
  1. //这个是头文件.h
  2. #pragma once
  3. #include <iostream>
  4. using namespace std;
  5. #include <ctime>

  6. class C12_08_16
  7. {
  8. public:
  9.         C12_08_16(void);
  10.         ~C12_08_16(void);
  11.         int work(void);

  12. private:       
  13.         int test(void);
  14.         int test1(void);
  15.         int plus(int,int);
  16.         double plus(double,double);
  17.         int sum(int a,int b);
  18. };

  19. //这个是cpp文件
  20. int C12_08_16::test1()
  21. {       
  22.         int (*pSum)(int,int);
  23.         pSum = sum;                         //出错
  24.         pSum(0,50);
  25.         return 0;
  26. }

  27. int C12_08_16::sum(int a,int b)
  28. {
  29.         int sn = 0;
  30.         for(int i = a; i <= b; i++)
  31.                 sn += i;
  32.         return sn;
  33. }
复制代码
我是想把一个函数指针指向一个类成员函数。现在在赋值指向的操作中,出现错误。请个问指教下,具体的如何解决。
我现在只知道一个错误的地方,就是必须把需要被函数指针指向的函数要定义成静态函数static,但是我另外想请教点知识的问题,static本身不是将变量或者函数定义为全局性的吗?同时他有个特性就是用static所定义的变量和函数不能被其他类所调用和使用。那么,对于类中的成员函数而言,是否用static来定义有什么意义吗?类成员函数本身就是一个类中的全局函数。是否指定static貌似没什么区别。如果用static指定函数sum后,后面的具体操作是否和正常的使用函数指针一样?直接拿pSum调用就行了呢?
请个问指点下,菜鸟求指点!~

点评

比原来有长进了!!可以啊你~  发表于 2012-8-25 00:50
非常有代表性!  发表于 2012-8-25 00:49
发表于 2012-8-16 21:17:05 | 显示全部楼层
这个问题的关键是函数指针指向了一个类成员函数。
函数指针是通过指向函数的指针间接调用函数。函数指针指向普通函数是没有问题的。函数指针可以实现对参数类型、参数顺序、返回值都相同的函数进行封装,是多态的一种实现方式。
由于类的一般成员函数中有一个隐形的this指针,因此,类的成员函数的指针和一般函数的指针的表现形式不一样。要消除this指针的影响,可以将类成员函数声明成静态成员函数。
发表于 2012-8-20 17:32:45 | 显示全部楼层
但是实际上,通过程序也是可以通过函数指针的方式访问普通类成员函数。
如下面这个例子:
  1. #include "stdafx.h"
  2. #include <iostream>
  3. using namespace std;

  4. class A
  5. {
  6. private:
  7.         int a;
  8. public:
  9.         A(int _a): a(_a)
  10.         {}
  11.         void fun1() const
  12.         {
  13.                 std::cout << "this is fun1, a = " << a << std::endl;
  14.         }
  15.         int fun2() const
  16.         {
  17.                 std::cout << "this is fun2, a = " << a << std::endl;
  18.                 return 0;
  19.         }
  20.         static void fun3(const A& _a)
  21.         {
  22.                 std::cout << "this is  fun3, ";
  23.                 _a.fun1();
  24.         }
  25.         friend void fun4(const A& _a)
  26.         {
  27.                 std::cout << "this is fun4, a = " << _a.a << std::endl;
  28.         }
  29. };

  30. typedef void (A::*pcf)()const;

  31. void call_A(pcf pF, const A& _a)
  32. {
  33.         (_a.*pF)();
  34. }

  35. int _tmain(int argc, _TCHAR* argv[])
  36. {
  37.         A a(10);

  38.         call_A(&A::fun1, a);

  39.         return 0;
  40. }
复制代码
在这个例子中,fun1是类A的成员函数,我们通过typedef void (A::*pcf)()const; 定义了一个pcf函数指针指向了A::fun1()就可以直接调用。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2025-5-15 04:53

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表