我们有一个存储类,类Person
的定义如下:
class Person
{
public:
string m_name;
string m_address;
string m_phone_number;
};
我们希望有一个存储类 ,PersonPool
它存储所有 Person 的实例。
班级要求:
- 应该包含所有 Person 的实例。
- 应该提供将 Person 添加到池中的方法。
- 应提供快速访问方法以按地址删除人员
- 应按地址为人员提供快速的非常量获取器
我们建议以下课程:
class PersonPool
{
public:
void add_person(const Person& p) { m_persons.insert(p.m_address, p); }
bool person_exists(string address) { return m_persons.has_key(address); }
Person& get_person(string address) { return m_persons[address]; }
void remove_person(string address) { m_persons.erase(address); }
private:
map<String,Person> m_persons; ///> key: person address; value: Person's instance
};
用法示例
说我有这段代码:
- 个人池 p_pool;
- 人 p1;
- p1.m_address = "x";
- p_pool.add_person(p1);
- 人& p2 = p_pool.get_person("x");
- p2.m_address = "y";
- p_pool.get_person("y");
问题
示例中的第 6 行修改了Person
.
当我想得到一个Person
基于新地址(“y”)的时候,PersonPool
将无法返回这个Person
。
它不“知道”地址已被修改,但仍保留旧地址“x”作为该 Person 实例的键。
PersonPool
增强建议:
- 地图的关键不应该是地址。
问题:- 什么是正确的钥匙?请记住,我们需要通过地址快速访问。
- 如果我们选择的新密钥也被
Person
的用户修改了怎么办(甚至 m_name 也可能被修改)
- 将函数添加到
PersonPool
:
void update_person(string old_address, string new_address)
问题:- 丑陋的。用户不应该为我糟糕的设计而烦恼。
- 如果用户不使用此方法怎么办
- 仅提供 const getter。对存储在 中的Person的任何修改都
PersonPool
必须使用问题提供的新功能来完成PersonPool
:- 打破班级要求。我们需要非常量的 getter
- 即使我们放弃该要求,这也意味着我们必须
Person
在PersonPool
. 我们当然不想这样做。
问题:
你能想出一个更好的PersonPool
实现吗。是否可以调整我的建议并摆脱问题。
谢谢你的时间!