我有一堂课代表一个人的名单。
class AddressBook
{
public:
AddressBook();
private:
std::vector<People> people;
}
我想允许客户遍历人脉。我首先想到的只是:
std::vector<People> & getPeople { return people; }
但是,我不想将实现细节泄漏给客户端。修改向量时,我可能想保留某些不变式,而当我泄漏实现时,我将失去对这些不变式的控制。
允许迭代而不泄漏内部的最佳方法是什么?
2
首先,如果要保持控制,则应将向量作为const引用返回。您仍然会以这种方式公开实现细节,因此我建议使您的类可迭代,并且从不公开您的数据结构(也许明天将成为哈希表?)。
—
idoby 2014年
谷歌快速搜索显示了以下示例:sourcemaking.com/design_patterns/Iterator/cpp/1
—
Doc Brown
@DocBrown所说的可能是适当的解决方案-在实践中,这意味着您为AddressBook类提供了begin()和end()方法(加上const重载,最后还有cbegin / cend),它们仅返回向量的begin()和end( )。这样一来,您的课程也将可用于所有大多数标准算法。
—
stijn 2014年
@stijn应该是一个答案,而不是评论:-)
—
Philip Kendall
@stijn不,那不是DocBrown和链接的文章所说的。正确的解决方案是使用指向容器类的代理类以及指示位置的安全机制。返回向量的
—
rwong 2014年
begin()
和end()
是很危险的,因为(1)这些类型是向量迭代器(类),它阻止一个向量切换到另一个容器,例如set
。(2)如果修改了向量(例如,增长了或删除了某些项目),则某些或所有向量迭代器可能已经失效。