关闭

局部类实现C++的闭包

发表于:2013-4-08 09:35

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:jamesfancy    来源:51Testing软件测试网采编

  首先说明,虽然经常提到闭包,但我对闭包这个概念还真是不清晰,隐约感觉如果函数A中定义并返回了函数B,而函数B在函数A之外仍然可以正常运行并访问函数A中定义的变量,同时函数A中定义的变量不能被外部访问,就叫闭包——如果这个理解错了,那就当我啥也没说!

  看到有人写博说通过C++11的新特性std::bind来实现闭包,仔细想了一下,其实通过C++03的两个特性就可以实现的:一个是局部类,一个是静态局部变量。

  静态局部变量

  C++允许在函数内部定义静态的局部变量,这些变量不会在离开函数时被销毁,就像这样

  1. void func() { 
  2.     static int i = 0; 
  3.     cout << i++ << endl; 
  4. }

  如果多次调用func,会发现输出到控制台的值一直在递增。

  局部类

  想在函数里定义局部函数是不可能的,C++没这个语法。但是可以在函数里定义局部类,这个类只能在该函数里使用,很有意思的,就像这样

  1. void func() { 
  2.     class LocalClass { 
  3.     private
  4.         // 定义私有成员 
  5.     public
  6.         void run() { 
  7.             // ...... 
  8.         } 
  9.     } obj; 
  10.     obj.run(); 
  11. }

  如果需要将局部类对象返回到外面,就需要定义一个接口,用于接收返回的对象并调用其中的方法;同时,在函数内需要使用new来生成对象并返回其指针,就像这样

  1. class ILocal { 
  2. public
  3.     virtual void run() = 0; 
  4. }; 
  5. ILocal* func() { 
  6.     class LocalClass: public ILocal { 
  7.     public
  8.         virtual void run() { 
  9.             // ...... 
  10.         } 
  11.     }; 
  12.     return new LocalClass(); 
  13. }

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号