Skip to content

1313: Wrapper Function

题目

题目描述

在程序设计里,一个包装函数(Wrapper Function)指的是在一个专门的函数中调用另一个函数,其中外层函数叫做内层函数的包装函数。包装函数除了调用内层函数之外,还可以做一些额外的检查或者调用,因此,拥有广泛的应用。在编写代码的时候,我们通常为了更好地封装一个函数,使得暴露给用户的借口更加简洁,或者为了增强代码的安全性,在调用一段函数之前先做一些必要的错误检查来排除错误调用。

现在,我们希望实现一个简单的包装函数管理工具。具体来说,我们希望通过给一个函数添加包装函数,使得在调用这个函数的时候,代码会先运行一段前置函数before(),这个函数调用结束后,代码还会运行一段后置函数after()

为了简化对这个包装函数管理系统的模拟,避免使用模板函数,我们规定一段添加到包装函数管理系统的函数的接口一致(形参为string类型,无返回值),并且前/后置函数的接口也一致(无形参,无返回值)。

  • 通过包装函数管理系统的create()操作,系统中添加一套函数(包括原函数,前/后置函数)。
  • 通过包装函数管理系统的remove()操作,系统删除指定位置的函数,
  • 通过包装函数管理系统的run()操作,系统先后调用指定的前置函数,原函数,后置函数。
  • 通过包装函数管理系统的destroy()操作 ,系统完成析构并重置(可能再次使用)。

(提示)因为系统要动态地添加和删除函数,我们希望通过链表来完成这个系统。保证测试程序在结束前调用destroy()函数,并且需要内存泄漏检测,请务必注意填写destroy()函数。

请填写下面的hpp文件并提交。其中定义Wrapper的结构体作为一个链表的节点,在调用包装函数系统的时候,通过Wrapper *指针定位需要操作的函数。

```cpp // "Wrapper": src.hpp

ifndef Wrapper_CPP_Wrapper_HPP

define Wrapper_CPP_Wrapper_HPP

include

struct Wrapper{ // todo: add definitions here

}; // todo: add definition for link list

// todo: create()

// todo: remove()

// todo: run()

// todo: destroy()

endif //Wrapper_CPP_Wrapper_HPP

```

为了方便理解函数接口,给出一个调用例子。

```cpp // "Wrapper": example.cpp

include

include "src.hpp"

using namespace std;

void foo(string id) { cout << id << endl; } void before() { cout << "before foo" << endl; } void after() { cout << "after foo" << endl; }

int main(){ Wrapper f = create(foo, before, after); run(f, "Hello"); Wrapper g = create(foo, after, before); run(g, "World!"); remove(g); destroy(); return 0; } ```

example.cpp的输出是

text before foo Hello after foo after foo World! before foo

数据范围

其中15%的数据仅测试create()操作

另外15%的数据测试创建操作仅出现在最开始

另外30%的数据打乱测试前三个操作

另外40%的数据打乱测试所有操作

Oops! 本题目还没有解答!

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

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

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