设为首页 加入收藏

TOP

局部类实现C++的闭包(一)
2013-04-10 11:53:07 来源: 作者: 【 】 浏览:552
Tags:部类 实现

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

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

  静态局部变量

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

  void func() {

  static int i = 0;

  cout << i++ << endl;

  }

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

  局部类

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

  void func() {

  class LocalClass {

  private:

  // 定义私有成员

  public:

  void run() {

  // ......

  }

  } obj;

  obj.run();

  }

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

  class ILocal {

  public:

  virtual void run() = 0;

  };

  ILocal* func() {

  class LocalClass: public ILocal {

  public:

  virtual void run() {

  // ......

  }

  };

  return new LocalClass();

  }

  基础知识具备了,下面来实现闭包,过程就不说了,看注释吧

  #include <iostream>

  using namespace std;

  //////// 接口法实现 ////////////////////////////////////////

  // 定义一个函数对象接口……就像C#的委托

  class ITest {

  public:

  // 定义这个运算符主要是为了像函数一样调用,就像这样:obj();

  void operator() () {

  process();

  }

  protected:

  // 接口函数

  virtual void process() = 0;

  };

  // 下面函数返回一个ITest对象指针

  ITest* test() {

  // 函数内的静态变量,离开函数也不会销毁,而且可以

  static int count = 0;

  // 定义一个局部类

  class Test: public ITest {

  public:

  // 实现ITest中定义的接口函数来实现操作

  virtual void process() {

  cout << "Count is " << count++ << endl;

  }

  };

   

首页 上一页 1 2 3 下一页 尾页 1/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇关于C++虚函数的研究 下一篇四种查找算法的简单分析

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: