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 行目から static キーワードを削除し、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 に答える