Skip to content

1048: DeferClass

题目

题目描述

defer 机制是 Go 语言一个有趣的特性。其作用为“延迟执行”,通常被用于资源的及时回收处理。

在 Go 语言中,defer 后面会接上一个函数的调用。defer 语句会使得此函数被推迟到当前函数退出时才得以执行。

例如我们有如下代码 go func main() { f := createFile("/tmp/defer.txt") defer closeFile(f) writeFile(f) }

这样,closeFile(f) 能够在 main 函数退出的时候被调用,文件得到及时关闭。

有了 defer 语句,你就不用在每次 return 前都对资源一一回收,只需要在资源被获取时写好回收的语句就好了。

如果一个函数里面有多个 defer 语句,它们的执行顺序会表现出栈的形式。即,越往后的 defer 语句越先被执行。

既然 defer 这么方便,为什么不在 C++ 中实现一下呢?

本题要求你用 C++ 语言实现一个名为 Defer 的类,通过这个类来达成 Go 语言 defer 机制。

下面给出一个 Defer 类的调用示例。 ```C++

include "DeferClass.hpp"

void hello() { std::cout << "Hello world!" << std::endl; }

int main() { int *p = new int [2]; Defer defer(&{delete [] p;}); defer(&{std::cout << p[0] << " " << p[1] << std::endl;}); defer(&{p[0] = 0, p[1] = 1;}); defer(hello); p[0] = 2, p[1] = 3; return 0; } ```

这段程序的输出为: ``` Hello world! 0 1

```

且其会正常释放 p 指针申请的内存空间。

输入格式

(无)

输出格式

(无)

样例输入

(无)

样例输出

(无)

数据范围

你需要提交一份实现了 Defer 类的 DeferClass.hpp

由于 Lambda 表达式并不能被包装为 void (*func)() 这样的函数指针,你可能需要用到 C++11 起支持的新特性:std::function

std::function 位于 <functional> 库中,其实现了一个功能更加完善的函数指针。例如 std::function<void()> func 就相当于原先的 void (*func)()std::function<int(int, int)> func 就相当于原先的 int (*func)(int, int)

如果你还是不知道怎么实现这个 Defer 类,这里给出一个提示:类的构造函数在实例被初始化时调用,类的析构函数在实例生命周期结束的时候调用。operator() 可以被重载。

本题中被defer的函数均为返回值为void的无参数函数。

Oops! 本题目还没有解答!

助教老师们编题的速度,已经超过了解题的速度!

OJ翻了一新,但本解答集还大多用的是2017-2019级,甚至更早的同学们贡献的答案。

如果你已经AC了,可以的话,请您参考添加页面,与大家一起分享你的题解!