我在公司的笔试中遇到了这个问题。该类是这样的:
class DB
{
ABC *list;
public:
ABC *getlist();
ABC *addlast();
ABC *remove(x);
ABC *freelist();
.....
}
现在的问题首先是找到客户端可以自行修改列表的任何实例。因此,客户端可以通过getlist获取指针并使用它,或者使用ABC类API对其进行更多修改。
- 如何防止客户端修改此设置。可以制作哪些不允许客户端执行此操作的类体系结构。
细节决定成败:他们希望您保留数据库 API 的哪些方面。
最简单的方法是正确封装list
- 仍然使用您的伪代码风格......
class DB
{
ABC list; // I'd store by value unless there's a reason not to
public:
ABC getlist() const; // only get a copy
const ABC& getlistref() const; // another option...
void addlast(x);
void remove(x);
void freelist();
.....
};
其他选项包括使用迭代器公开list
(即 begin
和 end
函数),或提供 visit(VisitorFunctor&)
函数,让客户端代码对列表中的每个元素执行某些操作。