精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>C、C++语言基础>>指针技术>>请教指向类成员函数的函数指针的用法

主题:请教指向类成员函数的函数指针的用法
发信人: girlrong()
整理人: supermario(2000-05-27 15:00:06), 站内信件
    写了一个有关界面的类,想使它具有通用性。当在这个类中做完了某件事后
,想把结果通知外界。常用的方法是给外界某个窗口发个消息。还有另外一种方
法是通过本类中的一个函数指针成员调用外界某个函数,这个函数指针成员所指
向的函数是由使用本类的用户在声明本类的对象并做初始化时提供的。例如wind
ows的有些控件和别的一些东西就是这么做的,一件事完成了,它发个通知消息给
外界,或者调用外界给它提供的一个CallBack类型的函数。
    我使用第二种方法,在使用函数指针时有些问题,请大侠们帮忙。另外也请
大侠们指点,除了这两种将结果通知外界的方法外,还有没有什么更有效的方法


象下面这样使用函数指针是成功的:


int GetValue(int a,int b);
main() 

    int (*fun)(int a,int b);
    fun=GetValue;
    int v=(*fun)(10,20);
    printf("%d\n\n\n",v);
    return 0;

int GetValue(int a,int b)
{
    return a+b;
}


    如果类a里有个函数指针成员,想用类b的一个成员函数去给它初始化,该如
何做?就象下面的例子,想用类ClassTwo的成员函数去初始化类ClassOne的函数
指针成员,但总是不成功,原因何在?

#include <stdio.h>
class ClassTwo
{
public:
    int GetValue(int a,int b);
};

class ClassOne
{
public:
    ClassOne();
    void SetFunc(int (*fun)(int a,int b));
private:
    int (*pFun)(int a,int b);
    ClassTwo classtwo;
};


void ClassOne::SetFunc(int (*fun)(int a,int b))
{
    pFun=fun;
};

int ClassTwo::GetValue(int a,int b)
{
    return a+b;
}

ClassOne::ClassOne()
{
    SetFunc(classtwo.GetValue);//这句有问题,到底怎么写?
}

main() 

    ClassOne MyObject;
    return 0;



    如果把GetValue声明成static的,把出问题的那句SetFunc()改成SetFunc(C
lassTwo::GetValue)就能成功。但我只希望GetValue是个普通的成员函数。

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.243.167]
发信人: tengel (Dragon), 信区: CLanguage
标  题: Re: 请教指向类成员函数的函数指针的用法
发信站: 网易虚拟社区 (Fri Nov  5 17:22:10 1999), 站内信件

【 在 girlrong (阿蓉) 的大作中提到: 】
这是由于类成员函数实际上隐含有一个this参数,对于不同的编译器实现
也并不一样,一般在内部一个成员
void foo(int a)被转化为void _foo@(int a,ClassName *p)
之类,所以即使你的代码编译成功,运行也肯定出错.
实际上,一般情况,只需要把一个对象作为参数传递给类方法,然后在类方法中
点用object.Func()也应该可以.


--
独进小楼成一统,管他冬夏与春秋

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.104.33.10]
发信人: repus (Super), 信区: CLanguage
标  题: Re: 请教指向类成员函数的函数指针的用法
发信站: 网易虚拟社区 (Fri Nov  5 20:18:21 1999), 站内信件
【 在 girlrong (阿蓉) 的大作中提到: 】

GetValue 前有一个隐含的修饰符 __thiscall, 与你的函数指针类型不符,
但是你即使加上也没用,会出现运行期错误,应为缺少this 实参。
类的非静态成员函数是不应作为回调函数的,回调函数应该使用 __stdcall
调用协定(也就是以前的PASCAL)。

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.51.168]
发信人: zelor (张作乐), 信区: CLanguage
标  题: Re: 请教指向类成员函数的函数指针的用法
发信站: 网易虚拟社区 (Fri Nov  5 20:46:10 1999), 站内信件

   想法够新奇的,我以为只有在用C进行面向对象编程时才用得上函数指针呢!
--
冬雷滚滚夏雨雪,
山无棱,天地合,
WINDOWS再没有BUG,
才敢与君绝!
                           ———作乐的爱情格言    

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.46.189]
发信人: girlrong (阿蓉), 信区: CLanguage
标  题: Re: 请教指向类成员函数的函数指针的用法
发信站: 网易虚拟社区 (Fri Nov  5 22:49:59 1999), 站内信件

【 在 tengel (Dragon) 的大作中提到: 】
    非常感谢tengel和repus。原来还和调用协议有关:)

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.244.5]
发信人: girlrong (阿蓉), 信区: CLanguage
标  题: Re: 请教指向类成员函数的函数指针的用法
发信站: 网易虚拟社区 (Fri Nov  5 22:51:08 1999), 站内信件

【 在 zelor (张作乐) 的大作中提到: 】
    其实在mfc里也用了不少函数指针的。函数指针具有灵活性,但也很难用。

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.103.244.5]
发信人: hpb (lion), 信区: CLanguage
标  题: Re: 请教指向类成员函数的函数指针的用法
发信站: 网易虚拟社区 (Sun Nov  7 11:43:48 1999), 站内信件

【 在 girlrong (阿蓉) 的大作中提到: 】
我的想法:
class ClassOne 

public: 
    ClassOne(); 
    void SetFunc(int (ClassTwo::*fun)(int a,int b)); 
private: 
    int (ClassTwo::*pFun)(int a,int b); 
    ClassTwo classtwo; 
}; 

...

ClassOne::ClassOne() 

    SetFunc(&Classtwo::GetValue);


...
main()  
{  
    ClassOne MyObject; 
    MyObject.classtwo.*(MyObject.pFunc)(2,3);
    return 0; 
}  

没上机实验,只是一点看法。

--
※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.101.193.189]

[关闭][返回]