请问下这个算闭包吗,一直不懂是什么意思?

NDSM 发布于 2014/07/10 14:03
阅读 273
收藏 0

我的个人的理解是 获取到一个类【内部类的对象】或者封装在一个【函数中的函数】(js中)

以上是我个人的理解 希望各位指正,此外 我弱弱的问下闭包有什么实际的意义呢?谢谢各位!

我的第一种理解【获取内部类的对象】

#include <iostream>

using namespace std;


class ClosureBase
{
public:
	ClosureBase()
	{
		cout<<"ClosureBase"<<endl;
	}
	virtual ~ClosureBase()
	{
		cout<<"~ClosureBase"<<endl;
	}

	virtual void func() = 0;
};

class Class0
{
private:
	class InnerFoo : public ClosureBase
	{
	public:
		InnerFoo()
		{
			cout<<"InnerFoo"<<endl;
		}

		~InnerFoo(){}

		virtual void func()
		{
			printf("(InnerFoo) Do something\n");
		}
	};

	class InnerBar : public ClosureBase
	{
	public:
		InnerBar()
		{
			cout<<"InnerBar"<<endl;
		}

		~InnerBar(){}

		virtual void func()
		{
			printf("(InnerBar) Do something\n");
		}
	};

public:
	ClosureBase* func(int flag)
	{
		if(flag == 0)
		{
			return new InnerFoo();
		}
		else if(flag == 1)
		{
			return new InnerBar();
		}
		else
		{
			return NULL;
		}
	}
};


int main()
{
	Class0 cc;
	
	ClosureBase* pfoo = cc.func(0);
	pfoo->func();


	ClosureBase* pBar = cc.func(1);
	pBar->func();

	delete pfoo;
	delete pBar;
	
	getchar();
	return 0;
}



运行结果

ClosureBase
InnerFoo
(InnerFoo) Do something
ClosureBase
InnerBar
(InnerBar) Do something
~ClosureBase
~ClosureBase



我的第二种理解函数中的函数】但C++不能像JS一样在函数中定义函数所以我返回定义在内部类中的静态函数.

#include <iostream>

using namespace std;

typedef void(*PFN)(void);

class Class0
{
private:
	class Inner
	{
	public:
		static void foo()
		{
			cout<<"Class0::Inner:foo()"<<endl;
		}

		static void bar()
		{
			cout<<"Class0::Inner::bar()"<<endl;
		}
	};

public:
	PFN func(int a)
	{
		if(a == 0)
		{
			return Inner::foo;
		}
		else if(a == 1)
		{
			return Inner::bar;
		}
		else
		{
			return NULL;
		}
	}
};


int main()
{
	Class0 cc;
	
	cc.func(0)();
	cc.func(1)();
	getchar();
	return 0;
}

我也迷茫了-.-!!! 勿喷啊.......


加载中
0
sxgkwei
sxgkwei

闭包嘛,我个人觉得,就是让我们在函数式语音中用出了面向对象语言的效果:一个类可以有多个对象,每个对象内部的东西是相互独立的。

0
collinsz
collinsz

闭包是js的叫法? c++11 有lambda

http://stackoverflow.com/questions/7627098/what-is-a-lambda-expression-in-c11

如果你用过C#的委托或event,就会很好理解lambda的好处,简单来说就是匿名函数。

下面是个C++11 lambda的简单例子,

typedef void(*Func)(const char* msg);

void SayHello(Func func)
{
	func("hello!");
}

int main()
{
	SayHello([](const char* msg){ printf("%s\n", msg); });

	return 0;
}

输出:hello!


返回顶部
顶部