我看到这个问题:Class design with vector as a private/public member?,但我不认为它回答了这个问题。如何设计一个C++类而不将std :: vector作为公共成员?
我有一个叫做PrimeSieve
的类,可以初始化为PrimeSieve s(10000)
来执行诸如检查10000以下的数字是素数还是列出10000以下的所有素数等操作。特别是,我想知道如何执行后一个函数。
目前,我这样做,我认为这违反了面向对象的原则:
class PrimeSieve {
public:
...
std::vector<long long> primes;
客户将永远不需要更换载体,但我怎么还允许客户端通过遍历在一些号码(使用像vector.size()
所有的素数的载体?我想过,它返回值向量的访问方法,但似乎效率不高。
这是一个很好的方法,因为它允许稍后随着客户端代码继续工作(在重新编译之后)不变地工作而改变一些实现细节。具体地说,迭代器的实现可以稍后改变为例如生成任意数量的结果(CPU时间允许),而不是具有硬编码的限制,并且最重要的客户端使用 - “begin()”和取消引用/递增它返回的迭代器 - 可以继续工作。这是考虑你的界面中是否真的需要'end()'和'size()'的一个原因:客户可以决定他们什么时候“够用”了吗? – 2011-12-27 09:43:37
感谢您的回答!我对权衡这两种可能性感到好奇 - 这种方法比TonyK提出的方法有哪些优点? – Louis 2011-12-27 10:35:23
@Louis:正如你之前的评论所说,这个解决方案可以灵活地改变*内部*,而不需要客户端改变他们的代码,因为这没有公开实现的内部细节。例如,如果将'std :: vector'更改为'std :: list',则客户端代码不需要更改,因为客户端使用一对迭代器,并且不必担心'PriveSieve'是否内部使用vector或list。[续] – Nawaz 2011-12-27 10:47:26