游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4969|回复: 10

如何回调对象中的非静态成员函数

[复制链接]

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
发表于 2007-12-20 20:56:00 | 显示全部楼层 |阅读模式
我写了下面这样的代码。
请教下,怎么改才会正确?
#include <iostream>
using namespace std;

class Object
{
public:
        int x , y;
        int Area()
        {
                return x * y;
        }
};

void PrintArea(int (*Object::p(void)) , Object* obj)
{
        cout<<obj->p();
}

int main()
{
        Object obj;
        obj.x = 10;
        obj.y = 10;
        PrintArea(&Object::Area , &obj);
}

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
 楼主| 发表于 2007-12-20 21:23:00 | 显示全部楼层

Re: 如何回调对象中的非静态成员函数

有好心人帮我解决了,应该这样:

#include <iostream>
using namespace std;

class Object
{
public:
        int x , y;
        int Area()
        {
                return x * y;
        }
};

void PrintArea(int (Object::*p)() , Object * obj)
{
        cout<<(obj->*p)();
}

int main()
{
        Object obj;
        obj.x = 10;
        obj.y = 10;
        PrintArea(&Object::Area , &obj);
}

31

主题

249

帖子

259

积分

中级会员

Rank: 3Rank: 3

积分
259
 楼主| 发表于 2007-12-20 21:23:00 | 显示全部楼层

Re:如何回调对象中的非静态成员函数

非常感谢他

4

主题

23

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2007-12-21 10:22:00 | 显示全部楼层

Re:如何回调对象中的非静态成员函数

难以置信,这可以工作,据我所知,是无法获得对象的成员函数指针的。通常只能使用模板技术,我要测试一下,看看这是否真的能工作,如果能,不可思议。

4

主题

23

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2007-12-21 10:47:00 | 显示全部楼层

Re:如何回调对象中的非静态成员函数

经过验证可以工作,看来本人水平太差。

4

主题

23

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2007-12-21 11:37:00 | 显示全部楼层

Re:如何回调对象中的非静态成员函数

我又写了单继承和虚拟函数测试,工作的很好,至少我多了一种选择,改变了我的错误认识,谢谢。下面链接给出更为详细的阐述。而且成员函数指针有一个可怕的限制:它们只能指向一个特定的类中的成员函数。




http://dev.csdn.net/article/53/53738.shtm
http://www.codeproject.com/KB/cpp/FastDelegate.aspx

2

主题

29

帖子

29

积分

注册会员

Rank: 2

积分
29
QQ
发表于 2007-12-21 15:43:00 | 显示全部楼层

Re:如何回调对象中的非静态成员函数

void PrintArea(int (*Object::p(void)) , Object* obj)//显然有错。
{
cout<<obj->p();
}

函数指针的形式:返回类型 (*pfn)(参数列表)

18

主题

279

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
QQ
发表于 2007-12-22 08:56:00 | 显示全部楼层

Re:如何回调对象中的非静态成员函数

关于成员指针的细节请参阅[B].*[/B],[B]->*[/B]运算符的说明。

86

主题

2251

帖子

2386

积分

金牌会员

Rank: 6Rank: 6

积分
2386
QQ
发表于 2007-12-22 11:56:00 | 显示全部楼层

Re:如何回调对象中的非静态成员函数

这当然可以。
但很多情况下,需要的是一个普通函数做回调。

18

主题

279

帖子

279

积分

中级会员

Rank: 3Rank: 3

积分
279
QQ
发表于 2007-12-23 08:04:00 | 显示全部楼层

Re:如何回调对象中的非静态成员函数

但很多情况下,需要的是一个普通函数做回调。
YES!!!
对象、方法都要传,又不是类型无关,这个做法的耦合度也太高了!
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2025-12-20 04:34

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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