Инкрементная реализация оператора / итератора - PullRequest
6 голосов
/ 02 декабря 2010

Я пытаюсь выяснить пару вещей здесь:

  1. Как написать оператор приращения для класса узла, который имеет указатель на следующий узел?
  2. Как реализовать итераторы для класса, как показано ниже?

    #include <iostream>
    #include <vector>
    using namespace std;
    
    template <typename T>
    class Node {
    public:
        Node(int i=0):val(i) {}
        Node*& operator++(int i=0) {return next;};
    
        T val;
        Node *next;
    };
    
    //================================================
    int main() {
    
        Node<int> *head, *tmp1, *tmp2;
    
        tmp1 = new Node<int>(0); 
        head = tmp1;
    
        for (int i=1; i<10; ++i) {
    
            tmp2 = new Node<int>(i);
            tmp1->next = tmp2;
            tmp1 = tmp2;
        }
    
        while (head != NULL) {
    
            cout << head->val << " '";
            head = head->operator++(0);    //How do I make it work with ++head;?
        }
    }
    

Это не хороший пример для демонстрации перегрузки операторов или итераторов.

1 Ответ

11 голосов
/ 02 декабря 2010

Вы не реализуете operator++ для класса Node;Вы реализуете это для итератора.Класс итератора должен быть отдельным классом.

И, пожалуйста, не портите ваш шаблон, делая предположения (поскольку val - это T, ваш конструктор должен принимать T, а не int).Кроме того, не игнорируйте параметр int для оператора ++ следующим образом: это пустышка, используемая для того, чтобы отличать реализацию перед инкрементом от реализации после инкремента.от правильной инкапсуляции данных, управления памятью и т. д. Создание правильного класса связанного списка не просто.Вот почему стандартная библиотека предоставляет один.Не изобретай велосипед.

...