游戏开发论坛

 找回密码
 立即注册
搜索
楼主: sjinny

[C++][指针]关于指向成员函数的指针~

[复制链接]

54

主题

2917

帖子

3765

积分

论坛元老

Rank: 8Rank: 8

积分
3765
QQ
发表于 2004-8-18 13:13:00 | 显示全部楼层

Re:[C++][指针]关于指向成员函数的指针~

成员函数的指针我很早就想用了,可惜没成功过。

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-8-18 14:38:00 | 显示全部楼层

Re:[C++][指针]关于指向成员函数的指针~

可以把this指针做为参数传到函数里。

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-8-18 14:45:00 | 显示全部楼层

Re:[C++][指针]关于指向成员函数的指针~

经审查...你这个问题实际是运行时问题...
------------------------------
虽然服务器端程序不知道这些派生类的实例到底是怎样的(都通过基类指针来操作)
------------------------------就是这句话,电脑不会干自己不知道的事情. :)
class A
{
fuc();
};

class B : public A
{
fuc();
};
里的fuc不是一个东西哈,两个只是在h/cpp里取了一样的名字(即只有编译时的信息),而运行时两个的实际名字地址什么都是不一样的,毫无联系,你自己查查,编译器的函数输出就知道了.
恩,如果你不想在编译时确定你要调用什么函数的话,就必须在运行时确定,
所以,要在运行时确定是一定要花开销的,所以比较流行的做法是加一个virtual构成虚函数,这就有了运行时信息了(现在fuc这个名字代表着v-table里的偏移值),就可以用了.比较不流行的做法是自己维护一个函数指针列表,不过和v-tabel没多大的差异,而且比较难于维护.(按照你的说法,应该是想自己实做一个函数指针表出来,我先睡一下觉,等下再讨论哈)
恩,然后你可能还需要添加一个command模式,请参见模式设计的书.template版的可以看modern c++ design.

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-8-18 16:25:00 | 显示全部楼层

Re:[C++][指针]关于指向成员函数的指针~

shit , shit , i think now i see your mean ...
very sorry.
刚才误解了你的意思,你是想让客户端给服务器端传函数地址的方法来传函数命令 ?
这样...
class base
{
   void fuc_one_arg(int* arg);
   void fuc_two_arg(int* arg1,int* arg2);
   void fuc_three_arg(int* arg1,int* arg2,int* arg3);
};
class Tank
{
   void fire(float* p_degree);
   void move(short* p_ha,char* p_k);
};

union U_FUC_ARG_1
{
     int data;
     void (base::* p_fuc)( int* );
     void (Tank::* p)(float* );
};

union U_FUC_ARG_2
{
     int data;
     void (base::* p_fuc)( int*,int* );
     void (Tank::* p)(short* ,char* );
};

union Base_Change
{
    base* p_base;
    Tank* p_tank;
};

main
{
    //比如你从客户端接受到一个data(结构为 int command,int object_id
    command就是服务器端的实际指针地址
 我们读入它
   U_FUC_ARG_1 fuc_arg_1;
   fuc_arg_1.data = command;//用int是因为32的机器上指针是32
   然后你肯定有一个object的管理器,假设找到的这个物体是一个tank
   Base_change base_c;
   base_c.p_tank = object_find(object_id);//或者你直接让object_find
返回Base* p 更好,那样比较简单.
 p = object_find(object_id);//假设直接返回Base* p;
 然后我们就可以调用了
 float arg =1.8
 ( p->*(fuc_arg_1->p_fuc ) )(&arg);
}
//版本其实还可以再简化,不过这样比较能够看懂
所有参数用指针传递,是因为所有指针都是32的.
恩,没有使用void的指针是因为我记不得怎么定义void的指针了..
如果你还有其他 压贱 规范需要多定义几个base,这里的fuc都只是thiscall的.
在编译时保存函数地址就这样.
fuc_arg_1->p = Tank::fire ;
然后用fuc_arg_1->data 输出.

你要使用的话最好还是再封装一下.不然调用起来太麻烦了.

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-8-18 16:29:00 | 显示全部楼层

Re:[C++][指针]关于指向成员函数的指针~

不过实在不推荐使用储存指针的方式...
这样更新起来比较麻烦,你可以进一步添加一个 函数列表 来管理
在客户端 储存 index 这样比较好


顺带说一句,这个问题实在和继承没有关系,我们要利用的只是它的 调用规范而已...一般就是默认的__thiscall

13

主题

145

帖子

149

积分

注册会员

Rank: 2

积分
149
发表于 2004-8-18 18:06:00 | 显示全部楼层

Re:[C++][指针]关于指向成员函数的指针~

template <typename OT, typename PFT>
struct _wkMFPointer
{
};
template <typename OT,typename RT>
struct _wkMFPointer< OT, RT(*)() >
{
typedef RT (OT::*type)();
};
template <typename OT, typename RT, typename AT>
struct _wkMFPointer< OT, RT(*)(AT) >
{
typedef RT (OT::*type)(AT);
};
template <typename OT, typename RT, typename AT1, typename AT2>
struct _wkMFPointer< OT, RT(*)(AT1,AT2) >
{
typedef RT (OT::*type)(AT1,AT2);
};
template <typename OT, typename RT, typename AT1, typename AT2, typename AT3>
struct _wkMFPointer< OT, RT(*)(AT1,AT2,AT3) >
{
typedef RT (OT::*type)(AT1,AT2,AT3);
};

// 用于const函数
template <typename OT, typename PFT>
struct _wkCMFPointer
{
};
template <typename OT, typename RT>
struct _wkCMFPointer< OT, RT(*)() >
{
typedef RT (OT::*type)() const;
};
template <typename OT, typename RT, typename AT>
struct _wkCMFPointer< OT, RT(*)(AT) >
{
typedef RT (OT::*type)(AT) const;
};
template <typename OT, typename RT, typename AT1, typename AT2>
struct _wkCMFPointer< OT, RT(*)(AT1,AT2) >
{
typedef RT (OT::*type)(AT1,AT2) const;
};
template <typename OT, typename RT, typename AT1, typename AT2, typename AT3>
struct _wkCMFPointer< OT, RT(*)(AT1,AT2,AT3) >
{
typedef RT (OT::*type)(AT1,AT2,AT3) const;
};
呵呵,用模板偏特化,2003才能编译通过。

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2004-8-18 18:13:00 | 显示全部楼层

Re:[C++][指针]关于指向成员函数的指针~

这个的目的是?
我解决这个问题的思路是
一个函数的调用 要满足 两个 条件
压贱和call函数地址。
我利用这个class base{ }; 来满足压贱的方式。
而call的地址则是通过客户端给出,或是以客户端传递index的方式来得出
可以解释一下你的方法吗?

59

主题

1104

帖子

1199

积分

金牌会员

Rank: 6Rank: 6

积分
1199
发表于 2004-8-18 19:33:00 | 显示全部楼层

Re:[C++][指针]关于指向成员函数的指针~

...我开始也没看明白他的意思。。
如果是指index的问题的话。
我比较喜欢这样:
class CBaseObject {
public:
    virtual Execute(int cmd, int *argv, int args) = 0;
};
网络接收到消息以后根据根据ID号找到一个object,然后把
cmd和参数丢进去就好了,什么都不用管了。

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2004-8-18 21:58:00 | 显示全部楼层

Re: [C++][指针]关于指向成员函数的指针~

晕……你们说的我都不太懂……
不过还是谢谢大家~
大家看这图,基类里的那个是个hash表,这个hash表会在派生类的函数init()里被初始化,以后调用派生类的某个实例的成员函数,都是通过此hash表查找出指向成员函数的指针,然后在对某个特定的实例调用此函数……
问题是,hash表里的成员函数指针在声明时,必须指定它将要指向哪个类的成员函数,而我这里根本不知道它将指向哪个类的成员函数……

149

主题

4981

帖子

5033

积分

论坛元老

Rank: 8Rank: 8

积分
5033
QQ
 楼主| 发表于 2004-8-18 22:03:00 | 显示全部楼层

Re: [C++][指针]关于指向成员函数的指针~

图:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-8-17 08:59

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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