c++ - 友元迭代器可以访问非静态数据成员吗?

标签 c++ iterator friend

我有一个类 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/

相关文章:

c++ - 如何隐藏另一个包含的静态库的API?

C++ - 使用friend关键字来提高效率?

c++ - 如何与特定模板特化成为 friend ?

python - 在字典中搜索隐藏的键值对

list - 向前和向后迭代

python - 在 python 中使用重复迭代器将项目插入列表

c++ - std::forward 如何接收正确的参数?

c++ - Win32 C++ 在第二个监视器中创建窗口

C++:在另一个函数内声明一个函数不是编译器错误所以......它是什么?