游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6073|回复: 20

怎么在类中使用成员函数指针?

[复制链接]

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
发表于 2013-3-10 16:13:20 | 显示全部楼层 |阅读模式
本帖最后由 微无渊 于 2013-3-10 16:30 编辑

百度上千篇一律都是在类外使用成员函数指针,就没找到在类中使用成员函数指针示例:
直接上示例代码吧:
  1. class CTest
  2. {
  3. public:
  4.         CTest()
  5.         {
  6.                 CommandFunc p = NULL;
  7.                 p = &CTest::Test;

  8.                 p(10);  // 就是这里啦.. 这里会编译出错,说什么"项不会计算为接受 1 个参数的函数"
  9.         }

  10.         typedef int (CTest::*CommandFunc)(int a);

  11.         int Test(int a)
  12.         {
  13.                 return a;
  14.         }
  15. };
复制代码

我只知道可以这样做:
(this->*p)(10);
有没别的方式?

0

主题

7

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2013-3-13 12:09:04 | 显示全部楼层
                CommandFunc p = NULL;
                p = &CTest::Test;

                p(10);  // 就是这里啦.. 这里会编译出错,说什么"项不会计算为接受 1 个参数的函数

p没有指定类地址

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2013-3-13 12:16:19 | 显示全部楼层
yuqangy 发表于 2013-3-13 12:09
CommandFunc p = NULL;
                p = &CTest::Test;

你只要告诉我怎么写就行

0

主题

7

帖子

68

积分

注册会员

Rank: 2

积分
68
发表于 2013-3-13 13:22:18 | 显示全部楼层
Class Cls
{
public:
void f(float a){printf("");}
}

main()
{
typedef void (Cls::*pFun)(float);//申明类成员函数指针
pFun pClsFunc = &Cls::f;
CB TestCls;
(TestCls.*pClsFunc)(1.0);
}

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2013-3-13 13:44:39 | 显示全部楼层
yuqangy 发表于 2013-3-13 13:22
Class Cls
{
public:

我问的是如何在类中调用,不是在类外.

5

主题

84

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2013-3-17 15:44:35 | 显示全部楼层
在类内部调用么 ?? 试试 :

( this->*p )( ... )

this 就是类自身的指针啦,然后用 ->* 类成员函数地址解引用运算符就可以了

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2013-3-18 19:04:28 | 显示全部楼层
akima 发表于 2013-3-17 15:44
在类内部调用么 ?? 试试 :

( this->*p )( ... )

我是想知道除了这个方法,有没有别的

0

主题

3

帖子

95

积分

注册会员

Rank: 2

积分
95
发表于 2013-3-18 21:39:19 | 显示全部楼层
class CTest
{
public:
        typedef int (*CommandFunc)(int a);
        
        CTest()
        {
                CommandFunc p;
                p = &CTest::Test;

                cout<<p(10)<<endl;  // 就是这里啦.. 这里会编译出错,说什么"项不会计算为接受 1 个参数的函数"
        }

        

        static int Test(int a)
        {
                return a + 1;
        }
};
把成员函数写成静态的,可以直接p(10),不过typedef也要变下,非静态的成员函数貌似只能通过你提的那种方法

50

主题

236

帖子

454

积分

中级会员

Rank: 3Rank: 3

积分
454
 楼主| 发表于 2013-3-19 20:36:14 | 显示全部楼层
算了,算了,就this得了- -

23

主题

515

帖子

552

积分

高级会员

Rank: 4

积分
552
发表于 2013-4-8 22:57:22 | 显示全部楼层
  CTest()
        {
                CommandFunc p = NULL;
                p = &CTest::Test;

                (*p)(10);  // 就是这里啦.. 这里会编译出错,说什么"项不会计算为接受 1 个参数的函数"
        }


(*p)(10);
这样看看
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-13 19:04

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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