如何在不将std :: vector作为公共成员的情况下设计C++类?

Lou*_*uis 1 c++ oop vector

我已经看到了这个问题:使用vector作为私人/公共成员的类设计?,但我觉得它没有回答这个问题.

我有一个被调用的类PrimeSieve,可以初始化为PrimeSieve s(10000)执行操作,例如检查10000以下的数字是否为素数或列出10000以下的所有素数.特别是,我想知道如何执行后一个函数.

目前,我正在这样做,我认为这违反了OOP的原则:

class PrimeSieve {
public:
...
     std::vector<long long> primes;
Run Code Online (Sandbox Code Playgroud)

客户端永远不需要更改向量,但是我怎样仍然允许客户端迭代一些数字下的所有素数的向量(使用类似的东西vector.size()?我想过一个按值返回向量的访问器方法,但这似乎效率低下.

Naw*_*waz 9

我将该类定义为:

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)


Ton*_*nyK 6

这是一种方法:

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,自然地).