1

我有一个 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 行不能更改。

4

1 回答 1

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";
}
于 2013-08-16T17:48:27.487 回答