我有一个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行无法更改。
答案 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";
}