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了,可以的话,请您参考添加页面,与大家一起分享你的题解!