如何从C ++中的另一个类迭代获取数据?

时间:2009-09-02 12:09:04

标签: c++ iterator

在A类中,有一个向量V. V是私人会员。

在B级,我想打印V的所有项目。 这样做的最佳方式是什么?

在同一个类中获取向量的迭代器非常容易,但在另一个类中却不容易。

感谢您的阅读。

6 个答案:

答案 0 :(得分:5)

明白你的观点:

  

很容易得到一个迭代器   同一类中的向量,但不是   在另一堂课很容易。

(并且假设想要打印元素只是一个其他复杂动作的占位符)

您仍然可以通过AB内部typedef公开您class A { private: std::vector<int> V; public: typedef std::vector<int>::const_iterator const_iterator; const const_iterator begin() const { return V.begin(); } const const_iterator end() const { return V.end(); } }; 矢量的迭代器,例如

class B
{
public:
    void Foo()
    {
        A a;
        // do stuff that will put things into the collection inside 'a'
        std::copy(a.begin(), a.end(), std::ostream_iterator<int>(std::cout, " "));
    }
};

然后你可以使用这样的迭代器:

const_iterator

我在这种情况下使用了iterator,因为您要求进行只读访问,但如果您需要写访问权限,则可以使用{{1}}(尽管这可能是一个糟糕的设计选择写给那样的内部成员。)

答案 1 :(得分:3)

我拥有矢量,打印它是由A决定的。尽可能少地曝光,尤其是私人会员。

另一种选择是访客模式;这样可以保持数据的封装,同时又具有很大的灵活性。

struct A {
   template< typename F > void each( F& f ) const {
     std::for_each( data.begin(), data.end(), f );
   }

private:
   std::vector<int> data;
};

struct B : public A {
  static void tprint()( int i )  { std::cout<<i<<std::endl; }
  void print()const {
    each( tprint );
  }
};

答案 2 :(得分:2)

如果B想要打印A的向量,那就是A的请求,因此A应该在其公共接口中有一个方法来实现这一点,例如(例如V的类型为vector<int>):

class A {
…
public:
    void dump_values(std::ostream& out) const {
        std::copy(V.begin(), V.end(), std::ostream_iterator<int>(out, " "));
    }
}

答案 3 :(得分:1)

如果V是私人会员,那么你必须问为什么你想从课外到达它?为避免违反此数据的封装,您有以下几种选择:

  1. 打印A中的所有V项目。
  2. 将B的实例传递给A,以便它可以使用它来打印V中的项目。
  3. E.g。 :

    A::printInternalData( const B& printer ) { printer.print( V ); };
    

    除此之外,你必须将V暴露给外界。

答案 4 :(得分:0)

如何实现返回向量迭代器的this_stuff_begin()this_stuff_end()成员呢?目前尚不清楚将其私有化的用途是什么......

答案 5 :(得分:-1)

在不太了解A类和B类职责的细节的情况下,我建议A类返回对B类存储的向量的const引用。这使您可以对向量进行只读访问,而不需要复制的表现。

  class B
  { 
  private:
      std::vector<int> m_vector;
  public:
      const std::vector<int>& GetVector() {return m_vector}
  }


  class A
  {
  private:
       B m_b;
  public:
     void printVector()
     {
         const std::vector<int>& refToVec = m_b.GetVector();
         std::vector<int>::const_iterator iter = refToVec.begin();
         for (; iter != refToVec.end(); ++iter)
         {
            std::cout << *iter << std::endl;
         }
     }
  }