Определение оператора -> () в c ++ - PullRequest
1 голос
/ 13 января 2011

Скажите, пожалуйста, как оператор -> () определяется для итератора std :: list, чтобы ссылаться на элементы элемента, на который указывает итератор.

EDIT:

Проблема в том, что если вы реализуете так (Фред Нурк):

template<class T>
struct list {
private:
  struct Node {  // internal class that actually makes up the list structure
    Node *prev, *next;
    T data;
  };

public:
  struct iterator {  // iterator interface to the above internal node type
    T* operator->() const {
      return &_node->data;
    }
  private:
    Node *_node;
  }
};

Тогда, когда вы пишете:

struct A {
  int n;
};
void f() {
  list<A> L;  // imagine this is filled with some data
  list<A>::iterator x = L.begin();

  x->n = 42;
}

Тогда

x-> n Я понимаю, как x-> operator -> () n, который эквивалентен (Понятно a) n, который является неявностью. Как понять эту часть. Некоторые ответы говорят, что это эквивалентно x-> operator -> () -> n; (вместо x-> operator -> () n) но я не понимаю почему. Пожалуйста, объясните мне это.

Ответы [ 5 ]

3 голосов
/ 13 января 2011

Оператор -> ведет себя следующим образом:

T->x; // some field
T->foo(); // some function

... эквивалентно:

T.operator->()->x;
T.operator->()->foo();

Обратите внимание на повторное применение -> к тому, что возвращается.

3 голосов
/ 13 января 2011

(подсказка: возвращает указатель на элемент.)

2 голосов
/ 13 января 2011

Со многими подробностями, вот суть того, как это работает:

template<class T>
struct list {
private:
  struct Node {  // internal class that actually makes up the list structure
    Node *prev, *next;
    T data;
  };

public:
  struct iterator {  // iterator interface to the above internal node type
    T* operator->() const {
      return &_node->data;
    }
  private:
    Node *_node;
  }
};

Таким образом, дано:

struct A {
  int n;
};
void f() {
  list<A> L;  // imagine this is filled with some data
  list<A>::iterator x = L.begin();

  x->n = 42;
  // x.operator->() returns an A*
  // which gets -> applied again with "n"
}
2 голосов
/ 13 января 2011

Оператор -> реализован иначе, чем другие операторы в C ++.Ожидается, что операторная функция вернет указатель, и -> снова будет применен к этому указателю.

1 голос
/ 13 января 2011

Возвращает указатель.Просто для полноты приведем простой пример:

#include <iostream>
#include <vector>
using namespace std;

template <typename T>
class SafeVectorIterator
{
    vector<T> & _vec;
    size_t _pos;
public:
    SafeVectorIterator(vector<T> & vec) : _vec(vec), _pos(0) { }

    void operator++() { ++_pos; }
    void operator--() { --_pos; }

    T& operator*() { return _vec.at(_pos); }
    T* operator->() { return &_vec.at(_pos); }

};

struct point { int x, y; }; 

int main()
{
    vector<point> vec;
    point p = { 1, 2 };
    vec.push_back(p);
    vec.push_back(p);
    SafeVectorIterator<point> it(vec);
    ++it;
    it->x = 8;
    cout << (*it).y << '\n';

    return 0;
}
...