朋友迭代器可以访问非静态数据成员吗?

时间:2013-08-16 17:44:58

标签: c++ iterator friend

我有一个A类和一个简单的(非常有限的)迭代器A_iterator,它指向这个类并且是它的朋友:

#include<vector>
#include<iostream>
using namespace std;

class A_iterator{
public:
    A_iterator(int index) : _index(index) {}
    int operator*();
private:
    int _index;
};

class A{
    friend class A_iterator;
public: 
    typedef A_iterator iterator;
    A() {   _elems.push_back(1); _elems.push_back(2);   }   
private:
    static vector<int> _elems;  //line  19
};

vector<int> A::_elems; // line 22

int A_iterator::operator*()
{
    return A::_elems[_index];  //line   26  
}

int main()
{
    A a;
    A::iterator it(0);
    cout << *it << endl; //line 33
}

这很好用。但是,我不希望_elems是静态的。如果我将从第19行删除静态关键字并删除第22行,那么我应该如何修改第26行?第33行无法更改。

1 个答案:

答案 0 :(得分:6)

是的,友谊与static与非静态数据成员正交。您需要更改迭代器以包含对其迭代的容器的指针/引用,并使用该指针/引用而不是静态成员:

class A;
class A_iterator{
public:
    A_iterator(A &container, int index) : _index(index), _container(&container) {}
    int operator*();
private:
    int  _index;
    A   *_container;
};
//...
int A_iterator::operator*()
{
    return _container->_elems[_index];  //line   26  
}
int main() {
   A a;
   A::iterator it(a,0);
   std::cout << *it << "\n";
}