我有一个类 A 和一个简单(且非常有限)的迭代器 A_iterator 指向这个类并成为它的 friend :
#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 行删除 static 关键字并删除第 22 行,那么我应该如何修改第 26 行?第 33 行无法更改。
最佳答案
是的,友元与 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";
}
关于c++ - 友元迭代器可以访问非静态数据成员吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18279225/