首页 新闻 体育 娱乐 游戏 邮箱 搜索 短信 聊天 通行币 天气 答疑 交友 导航
新浪首页 > 科技时代 > 学园 > 开发者乐园 > 正文

轻松使用C++深入研究.NET委托与事件设计(2)

http://www.sina.com.cn 2004年06月07日 11:22 天极网

  文/翻译 曾毅

  C++中的类型安全函数指针

  对于“老式方法”的批判之一便是它们不是类型安全的[1]。下面的代码证明了这个观点:

  typedef size_t (*FUNC)(const char*);

美女啦啦队招募中 纵情享受人生第一乐趣
新浪招商引资征代理商 上网实用手册

  void printSize(const char* str) {

  FUNC f = strlen;

  (void) printf("%s is %ld chars\n", str, f(str));

  }

  void crashAndBurn(const char* str) {

  FUNC f = reinterpret_cast<FUNC>(strcat);

  f(str);

  }

  代码在[2]中可以找到。当然,在你使用reinterpret_cast的时候,你可能会遇到麻烦。如果你将强制转换(cast)去掉,C++编译器将报错,而相对来说更为安全的static_cast也不能够完成转换。这个例子也有点像比较苹果和橙子,因为在C#中万事万物皆对象,而reinterpret_cast就相当于一种解决方式。下面的这个C++程序示例将会采取使用成员函数指针的方法来避免使用reinterpret_cast:

  struct Object { };

  struct Str : public Object {

  size_t Len(const char* str) {

  return strlen(str);

  }

  char* Cat(char* s1, const char* s2) {

  return strcat(s1, s2);

  }

  };

  typedef size_t (Object::*FUNC)(const char*);

  void printSize(const char* s) {

  Str str;

  FUNC f = static_cast<FUNC>(&Str::Len);

  (void) printf("%s is %ld chars\n", s, (str.*f)(s));

  }

  void crashAndBurn(const char* s) {

  Str str;

  FUNC f = static_cast<FUNC>(&Str::Cat);

  (str.*f)(s);

  }

  static_cast运算符将转化Str::Len函数指针,因为Str是由Object派生来的,但是Str::Cat是类型安全的,它不能被转换,因为函数签名是不匹配的。

  成员函数指针的工作机制与常规的函数指针是非常相似的;唯一不同(除了更为复杂的语法外)的是你需要一个用来调用成员函数的类的实例。当然,我们也可以使用->*运算符来用指向类实例的指针完成对成员函数的调用。

  Str* pStr = new Str();

  FUNC f = static_cast<FUNC>(&Str::Len);

  (void) printf("%s is %ld chars\n", s, (str->*f)(s));

  delete pStr;

  只要所有的类是从基类Object派生来的(C#中就是这样),你就可以使用C++来创建类型安全的成员函数指针。

  【责任编辑:方舟】

<< 上一页  下一页 >>

评论】【应用软件论坛】【推荐】【 】【打印】【关闭
 

 
新 闻 查 询
关键词一
关键词二



热 点 专 题
中国企业家治理沙尘暴
纪念诺曼底登陆60周年
北京传递雅典奥运火炬
美国前总统里根逝世
中国残疾人艺术团赴美
2004北京国际车展
美英军队虐待伊俘虏
孙燕姿全国巡回演唱会
欧锦赛 NBA总决赛

 

 发表评论: 匿名发表 新浪会员代号:  密码:
 



科技时代意见反馈留言板 电话:010-82628888-5488   欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 会员注册 | 产品答疑

Copyright © 1996 - 2004 SINA Inc. All Rights Reserved

版权所有 新浪网