免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3114 | 回复: 10
打印 上一主题 下一主题

[函数] 为什么不能调用函数指针呢? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-05-19 16:29 |只看该作者 |倒序浏览
请各位大侠指点以下代码中,为什么不能调用函数指针呢?

//FunctionPointTest.cpp
#include <iostream.h>;

class Card
{
public:
fillDeck();
};


Card::fillDeck()
{
cout << "Function pointer Demonstation." << endl;
}


void FunctionPointerTest(void (*)());//declare a function pointer as the parameter

int main(int argc, char *args[])
{
Card *card = new Card;

FunctionPointerTest(card->;fillDeck);//why not invoke the function pointer?

return 0;
}

void FunctionPointerTest(void (* menuTest)())
{
(*menuTest)();
}

void fillDeck()
{
cout << "Demostrate the function pointer." << endl;
}
Compilier显示错误代码为
FunctionPointerTest(card->;fillDeck);//why not invoke the function pointer?但是随便写一个非成员函数,却可以调用,Why?
请各位大侠指教先!

论坛徽章:
0
2 [报告]
发表于 2004-05-19 16:42 |只看该作者

为什么不能调用函数指针呢?

void Card::fillDeck()
{
cout << "Demostrate the function pointer." << endl;
}

论坛徽章:
0
3 [报告]
发表于 2004-05-19 17:09 |只看该作者

为什么不能调用函数指针呢?

加了void 类型后,还是不行。

论坛徽章:
0
4 [报告]
发表于 2004-05-19 17:49 |只看该作者

为什么不能调用函数指针呢?

你的FunctionPointerTest的参数不对。我想应该是
  1. void FunctionPointerTest(void Card::(*)());
复制代码


同时,void Card::fillDeck() 是C++的成员函数,内部实际上有个隐含的this指针,因此你在FunctionPointerTest里面调用的时候,需要有一个对象实例才行,因此,这个函数的参数还需要一个指向Card对象的指针才行。

论坛徽章:
0
5 [报告]
发表于 2004-05-19 20:32 |只看该作者

为什么不能调用函数指针呢?

原帖由 "linux_newbie" 发表:

同时,void Card::fillDeck() 是C++的成员函数,内部实际上有个隐含的this指针,因此你在FunctionPointerTest里面调用的时候,需要有一个对象实例才行,因此,这个函数的参数还需要一个指向Card对象的指针才行。


我也这么认为!

论坛徽章:
0
6 [报告]
发表于 2004-05-19 21:45 |只看该作者

为什么不能调用函数指针呢?

No! 我不认为!因为,我要传递的是一个函数的指针(包括成员和非成员函数),而不是对象的指针,请注意这一点。
从理论上讲,每个对象都可以通过this指针访问自己的地址。但对象的this指针不是对象本身的一部分,而是this指针在每次成员调用对象时作为第一个隐式参加传递给对象(通过compilier)。
实事证明,改成void FunctionPointerTest(void Card:*)());语句后,Error同样存在。此代码可以考下调试的嘛。
Thank your discussions先!

论坛徽章:
0
7 [报告]
发表于 2004-05-19 23:15 |只看该作者

为什么不能调用函数指针呢?

Card::fillDeck()是个静态的东西,(虽然不是静态函数),因此并不是每个card对象都有不同的fillDeck的函数地址,而只是每次调用都有不同的this指针罢了。

你的
FunctionPointerTest(card->;fillDeck); 和
FunctionPointerTest(Card::fillDeck); 实际上是一样的。

因此如果没有一个对象的参数,根本就无法编译。你可以假设一下你的fillDeck里面如果用到了Card的一个成员变量,那这个变量从何处来。

估计你也折腾得够呛。给你个例子吧:


  1. void FunctionPointerTest(void (Card:: * func)(), Card& obj) {
  2.         (obj.*func)();
  3. }


  4. int main(int argc, char* argv[]){
  5.         Card card;
  6.         FunctionPointerTest(Card::fillDeck, card);
  7. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2004-05-20 00:35 |只看该作者

为什么不能调用函数指针呢?

首先,我不认为Card::fillDeck()不是静态的东西。c++提供了4个存储类型说明符:auto,register,extern 和 static。这四个分为两种存储类:自动存储类和静态存储类。auto和register用来声明自动存储类变量,extern和static用来声明静态存储类变量和函数的标识符。即全局变量是静态的东西。但用标号public修饰的标识符并不是全局的,故此语句不是静态的东西。
第二,“你的
FunctionPointerTest(card->;fillDeck); 和
FunctionPointerTest(Card::fillDeck); 实际上是一样的。 “这句 话有错误。因为上面已说明Card::fillDeck()不是静态的,所以自然是错的。
第三,所幸你谈到static这个话题,故我想到静态函数有两种调用形式:通过对象名调用和通过类名调用。也就是card->;fillDeck()和Card::fillDeck(),于是想到直接把fillDeck()成员函数定义成static void fillDeck()-----静态成员函数。一试之后,Error has been over!!
再次感谢你的讨论先!

论坛徽章:
0
9 [报告]
发表于 2004-05-20 08:41 |只看该作者

为什么不能调用函数指针呢?

一样的道理,静态成员函数和非静态成员函数根本区别在于静态成员函数没有this指针,而非静态成员函数有一个指向当前对象的指针this

论坛徽章:
0
10 [报告]
发表于 2004-05-20 08:45 |只看该作者

为什么不能调用函数指针呢?

FunctionPointerTest(card->;fillDeck); 和
FunctionPointerTest(Card::fillDeck); 实际上是一样的。

指的是代码区函数入口地址

so i consider what linux_newbie has said is true
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP