2015-10-14 1 views
1

У меня так много проблем, когда мы выясняем, как печатать односвязный список, используя перегрузки операторов. Всякий раз, когда я пытаюсь скомпилировать, я получаю ошибки, говоря, что '->' не является перегруженным членом SLinkedList, а ошибки, говорящие «next», не являются членами SLinkedList. Вот что я до сих пор.Использование перегрузки оператора для печати Singlely Linked List

template <typename E> class SLinkedList; 
template <typename E> class SNode; 

template <typename E> 
ostream& operator<< (ostream& out, const SLinkedList<E>& v); 

template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList<E>; 
}; 
template <typename E> 
class SLinkedList { 
public: 
    SLinkedList(); 
    ~SLinkedList(); 
    bool empty() const; 
    const E& front() const; 
    void addFront(const E& e); 
    void removeFront(); 
    int getSize(); 

private: 
    SNode<E>* head; 
    int size; 
}; 

template <typename E> 
ostream& operator <<(ostream& out, SLinkedList<E>& v) { 
    for (SNode<E>* n = v->next; n != NULL; n = n->next) 
    { 
     out << n->elem; 
    } 
    return out; 
    } 

//END OF CLASS METHOD DEFINITIONS 

float randGen() { 
    float num = (rand() % 1000) + 1; 
    num = num/1000; 
    return num; 
} 

void main() { 
    SLinkedList<float> lst; 

    int lstElems = 10; 
    for (int i = 0; i < lstElems; i++) { 
     lst.addFront(randGen()); 
    } 
    cout << lst << endl; 



    system("pause"); 
} 
+0

'V' является' SLinkedList & ',' не SLinkedList * ' –

ответ

1

One, v является ссылкой, а не указатель, поэтому компилятор жалуется -> не перегружена.

2, next не является членом SLinkedList, входит в состав SNode.

Три, вам необходимо предоставить общедоступные методы для итерации через связанный список. По крайней мере, метод, который возвращает head.

#include <iostream> 
#include <cstdlib> 
#include <list> 
using namespace std; 

template <typename E> class SLinkedList; 
template <typename E> class SNode; 

template <typename E> 
ostream& operator<< (ostream& out, const SLinkedList<E>& v); 

template <typename E> 
class SNode { 
private: 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList<E>; 
}; 
template <typename E> 
class SLinkedList { 
public: 
    class Iterator { 
    public: 
     const E &operator *() { 
      return curNode->elem; 
     } 

     Iterator &operator ++() { 
      this->curNode = this->curNode->next; 
      return *this; 
     } 

     bool operator == (const Iterator &o) const { 
      if (this == &o) return true; 
      return this->curNode == o.curNode; 
     } 

     bool operator != (const Iterator &o) const { 
      return !(*this == o); 
     } 

     Iterator(SNode<E> *n) : curNode(n) {} 
    private: 
     SNode<E> *curNode; 
    }; 

    SLinkedList() : head(nullptr) {} 
    ~SLinkedList() { 
     while (head != nullptr) { 
      auto next = head->next; 
      delete head; 
      head = next; 
     } 
    } 
    bool empty() const; 
    const E& front() const; 
    void addFront(const E& e) { 
     auto p = new SNode<E>; 
     p->elem = e; 
     p->next = head; 
     head = p; 
    } 
    void removeFront(); 
    int getSize(); 

    Iterator begin() const { 
     return Iterator(head); 
    } 

    Iterator end() const { 
     return Iterator(nullptr); 
    } 

private: 
    SNode<E>* head; 
    int size; 
}; 

template <typename E> 
ostream& operator <<(ostream& out, const SLinkedList<E>& v) { 
    for (auto i = v.begin(); i != v.end(); ++i) 
    { 
     out << *i; 
    } 
    return out; 
} 

//END OF CLASS METHOD DEFINITIONS 

float randGen() { 
    float num = (rand() % 1000) + 1; 
    num = num/1000; 
    return num; 
} 

void main() { 
    SLinkedList<float> lst; 

    int lstElems = 10; 
    for (int i = 0; i < lstElems; i++) { 
     lst.addFront(randGen()); 
    } 
    cout << lst << endl; 

    system("pause"); 
} 
+0

Изменение V к указателю делает' '<< недействителен в моей главной функции –

+0

Yep, что не будет работать, так. .. use '.' –

+0

Я никогда не использовал' .' Как именно я мог бы это реализовать? –