首先说明,虽然经常提到闭包,但我对闭包这个概念还真是不清晰,隐约感觉如果函数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;
}
};