我已经看到了这个问题:使用vector作为私人/公共成员的类设计?,但我觉得它没有回答这个问题.
我有一个被调用的类PrimeSieve
,可以初始化为PrimeSieve s(10000)
执行操作,例如检查10000以下的数字是否为素数或列出10000以下的所有素数.特别是,我想知道如何执行后一个函数.
目前,我正在这样做,我认为这违反了OOP的原则:
class PrimeSieve {
public:
...
std::vector<long long> primes;
Run Code Online (Sandbox Code Playgroud)
客户端永远不需要更改向量,但是我怎样仍然允许客户端迭代一些数字下的所有素数的向量(使用类似的东西vector.size()
?我想过一个按值返回向量的访问器方法,但这似乎效率低下.
我将该类定义为:
class PrimeSieve
{
public:
typedef std::vector<long long>::const_iterator const_iterator;
const_iterator begin() const { return primes.begin(); }
const_iterator end() const { return primes.end(); }
long long operator[](int index) const { return primes[i]; }
size_t size() const { return primes.size(); }
//rest of the members which compute the primes!
private:
std::vector<long long> primes ;
} ;
Run Code Online (Sandbox Code Playgroud)
我认为该类的用户应该具有对向量的只读访问权限,因此我const_iterator
在typedef定义中使用.另请注意,这operator[]
是一个const
成员函数,这意味着您只能访问该值,但不能修改它.
用法:
PrimeSieve sieve(1000); //compute
//print to stdout
std::copy(sieve.begin(),
sieve.end(),
std::ostream_iterator<long long>(std::cout, " "));
Run Code Online (Sandbox Code Playgroud)
这是一种方法:
class PrimeSieve {
public:
const std::vector<long long>& getPrimes() const {
return primes ;
}
private:
std::vector<long long> primes ;
} ;
Run Code Online (Sandbox Code Playgroud)
这里没有低效率 - 返回引用至少与返回指针一样有效.并且客户端可以遍历返回的向量getPrimes
(使用a const_iterator
,自然地).
归档时间: |
|
查看次数: |
212 次 |
最近记录: |