游戏开发论坛

 找回密码
 立即注册
搜索
查看: 15659|回复: 22

成员函数指针的问题(看到那么多人提问题我也提一个)

[复制链接]

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2006-10-25 12:27:00 | 显示全部楼层 |阅读模式
void PC()
{
//...随便写什么
}

class Sony
{
public:
void PS3()
{
  //...随便写什么
}
}g_sony;

class Nintendo
{
public:
void Wii()
{
  //...随便写什么
}
}g_nintendo;

void (*Game)();

void main()
{
Game=PC;//指向全局函数,这个肯定没问题

//问题是有什么办法能让Game也能指向各种对象的成员函数?(函数指针最好通用一点)如下:
Game=g_sony.PS3;       //出错
Game=g_nintendo.Wii;  //出错
}

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2006-10-25 12:41:00 | 显示全部楼层

Re:成员函数指针的问题(看到那么多人提问题我也提一个)

使用functor吧。
可以这样 func = bind(&Nintendo::Wii, &g_nintendo);

35

主题

1735

帖子

1739

积分

金牌会员

Rank: 6Rank: 6

积分
1739
QQ
发表于 2006-10-25 12:48:00 | 显示全部楼层

Re:成员函数指针的问题(看到那么多人提问题我也提一个)

你的代码是伪代码吗?如果不是的话,那你类的成员函数是私有的,当然出错。你的示例代码不严谨(要么说明是伪代码,要么就写全了,关键字该写的写)所以不好回答。

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-10-25 13:29:00 | 显示全部楼层

Re:成员函数指针的问题(看到那么多人提问题我也提一个)

感觉像是来踢馆的。。。
回答有3:
1.  使用boost::functional
2.  使用boost::bind和boost::mem_fn
3.  自己写(代码随后)

#include "stdafx.h"


void PC()
{
}

class Sony
{
public:
        void PS3()
        {
        }
}g_sony;

class Nintendo
{
public:
        void Wii()
        {
        }
}g_nintendo;


template <typename T>
class Game
{
        void (T::*_pMemFunc)();

public:
        Game() : _pMemFunc(0) {}
        Game(void (T::*pMemFunc)()) : _pMemFunc(pMemFunc) {}

        Game &set(void (T::*pMemFunc)())
        {
                _pMemFunc = pMemFunc;

                return *this;
        }

        void operator ()(T* pInstance)
        {
                (pInstance->*_pMemFunc)();
        }
};

template <>
class Game<void>
{
        void (*_pFunc)();

public:
        Game() : _pFunc(0) {}
        Game(void (*pFunc)()) : _pFunc(pFunc) {}

        Game &set(void (*pFunc)())
        {
                _pFunc = pFunc;

                return *this;
        }

        void operator ()()
        {
                (*_pFunc)();
        }
};

int _tmain(int argc, _TCHAR* argv[])
{
        Game<void> game0 = &ampC;
        game0();
        Game<Sony> game1 = &Sony:S3;
        game1(&g_sony);
        Game<Nintendo> game2 = &Nintendo::Wii;
        game2(&g_nintendo);

        return 0;
}

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-10-25 13:38:00 | 显示全部楼层

Re:成员函数指针的问题(看到那么多人提问题我也提一个)

PS,不使用std::mem_fun是因为其要求必须有返回值,而且LZ所提的这种情况非常适合针对性定制设计。

3

主题

155

帖子

161

积分

注册会员

Rank: 2

积分
161
发表于 2006-10-25 14:14:00 | 显示全部楼层

Re:成员函数指针的问题(看到那么多人提问题我也提一个)

看到那么多人在回答问题我也回答一个,补充

普通函数和类成员函数是两个完全不同的事情,即使进行强制类型转换也不行
成员函数带隐含式参数"this",静态成员函数不带隐含式参数"this".
class A{
public:
        int f1(){...};
        static int f2(){...}
        int f3()const{..}
}a;
////////////////////////////////////
//普通成员函数
int (A::*pMF1)();   //函数指针定义
int (A::*pMF2)();   //函数指针定义
pMF1 =  A::f1;      //函数指针赋值
pMF2 = &A::f2;     //函数指针赋值
//有些老的编译器可以通过没有&号的赋值方式,但标准C++强制要求加上&号
// 下不再重述
//使用       
A* pA = &a;
(a.*pMF1)();(a.*pMF2)();         //调用
(pA->*pMF1)();(pA->*pMF2)();//调用
///////////////
///(静态成员函数)
int (*pF1)();   //函数指针定义
int (*pF2)();   //函数指针定义
int (*pF3)();  //函数指针定义
int (*pF4)();  //函数指针定义

pF1 = A::f1;    //函数指针赋值
pF2 = &A::f1;  //函数指针赋值
pF3 = a.f1;     //函数指针赋值
pF4 = &a.f1;   //函数指针赋值
//使用
pF1(); pF2();pF3(); //函数指针调用
///////////////////////
//CONST 成员函数
int (A::*pCMF1)()const;//定义
int (A::*pCMF2)()const;//定义
pCMF1 = A::f3;//赋值
pCMF2 = &A::f3;//赋值
//使用
(a.*pCMF1)();(a.*pCMF2)();            //调用
(pA->*pCMF1)();(pA->*pCMF2)();   //调用

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
 楼主| 发表于 2006-10-25 17:23:00 | 显示全部楼层

Re: Re:成员函数指针的问题(看到那么多人提问题我也提

ricohcanon: Re:成员函数指针的问题(看到那么多人提问题我也提一个)

你的代码是伪代码吗?如果不是的话,那你类的成员函数是私有的,当然出错。你的示例代码不严谨(要么说明是伪代码,要么就写全了,关键字该写的写)所以不好回答。


不好意思,我疏忽了。 [em10]

“boost::bind和boost::mem_fn”;这种东西我不太敢用,我怕有其他C++编译器不支持。我还是关注一下版主的第三种方法,不过好象有点麻烦。
我只是希望有个方便的函数指针能被这样用,如下:

Game=PC;
Game=g_sony.PS3;
Game=g_nintendo.Wii;

有时编程序真的非常需要这样使用,害的我只能在参数里加了一个“LPVOID lpContext”用来传递类对象的参数。 [em6]

54

主题

2916

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
 楼主| 发表于 2006-10-25 17:57:00 | 显示全部楼层

Re: Re:成员函数指针的问题(看到那么多人提问题我也提

千里马肝: Re:成员函数指针的问题(看到那么多人提问题我也提一个)

感觉像是来踢馆的。。。
回答有3:
1.  使用boost::functional
2.  使用boost::bind和boost::mem_fn
3....


我看了一下你的第3种方法,我的函数指针不一定都是“void (*fun)()”(这只是示例而已)可能会是“int (*fun)(float,int)”其他形态的,难道要我为每一种函数指针形态写一个模版类吗? [em4]


这是我多年编程积压的一个难题希望靠大家的力量解决,没有踢馆的意思,请大家请多赐教。 [em5]

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-10-25 18:08:00 | 显示全部楼层

Re:成员函数指针的问题(看到那么多人提问题我也提一个)

谁要是能用c++实现出以下这样,尽量放狗咬我。
Game=PC;
Game=g_sony.PS3;
Game=g_nintendo.Wii;

LZ要求的解法就在boost::funtional里,boost是准标准库,毋须怀疑,任何的不信任都是有罪的,请LZ自行下载boost然后去看Doc

121

主题

2029

帖子

2034

积分

金牌会员

Rank: 6Rank: 6

积分
2034
QQ
发表于 2006-10-25 19:57:00 | 显示全部楼层

Re:成员函数指针的问题(看到那么多人提问题我也提一个)

楼上的,放狗咬你的希望还是有的,就是估计自己先累死,可以考虑编写代码生成器,哇哈哈哈,我放你咬死你~~~~~
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2026-1-25 16:56

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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