以下是我班级的一小部分样本:
#include <string>
#include <vector>
using std::string;
using std::vector;
struct Book {
string m_author;
string m_title;
};
class BookList
{
public:
BookList();
~BookList();
private:
vector<Book*> m_books;
}
如您所见,BookList的数据以vector
Book
的形式存储。编写访问器的最佳方法是什么?我是否应该允许用户通过HasMore()
&amp; GetNextBook()
方法,或者只返回整个向量会更好吗?或者也许是迭代器?
提前致谢。
答案 0 :(得分:1)
如果您没有在课程中添加任何其他功能,您可以考虑使用typedef代替:
typedef vector<Book*> BookList;
如果要添加其他功能,则公开迭代器begin()
和end()
,类似于STL容器和修改方法。
答案 1 :(得分:1)
首先,您可能不需要存储指针。请改用值。在这里你有三个选项之一,真的:
std::vector<Book>
。 GetNextBook
方法很糟糕,因为它使你的列表存储迭代状态没有充分的理由。并且也让你成为唯一一个这样做的人。
答案 2 :(得分:0)
返回对向量或迭代器对的引用。以非标准方式编写访问器/重新实现迭代器接口是没有意义的。 另一个有用的选项是从STL容器派生您的类。
答案 3 :(得分:0)
最终,你想让它尽可能抽象,至少对任何公众都是如此。有几点需要考虑:
vector
而不会破坏与其他所有内容的兼容性。如果您可能不需要更改实现,则返回迭代器可能会有效。
答案 4 :(得分:0)
正如其他人所提到的,如果BookList
没有其他责任,删除typedef
类并将其替换为适当的BookList
可能是最佳选择。但是,如果需要BookList
,那么提供m_books
访问权限的一些选项将是:
第一个选项是最简单的但是将内部数据布局暴露给客户端。第二个选项允许您替换底层容器而无需对客户端进行任何更改。由您来决定哪种最适合您的设计。
此外,如果vector< Book* >
不是多态基类,您可能需要考虑将vector< Book >
替换为Book
。如果是,那么智能指针的容器可能是更好的选择。