C ++ - << перегрузка оператора, связанный список - адрес вместо стандартного вывода - PullRequest
0 голосов
/ 18 мая 2018

Я пытаюсь перегрузить выходной оператор.

Программа компилируется, но вместо вывода (список узлов) печатает некоторый адрес.

Не могли бы вы объяснить, где я допустил ошибку?

Я уверен, что функция displayList верна.Если вы также видите что-то неправильное, сообщите мне.

РЕДАКТИРОВАТЬ : если я разыменую myList, я получаю ошибку: неопределенная ссылка на `operator << (std :: ostream &, SingleLinkedList const &) '</em> Что-то не так с const?

полный, исполняемый код - https://codepad.remoteinterview.io/DPAXORFXKM

вывод:

Constructor called...
Display function:
10 --> 20 --> 30 --> 
Display - overloaded operator:
0x9152a10

Destructor called...

template <typename T>
class SingleLinkedList{
protected:
    struct Node{
        T data;
        Node * next;
        Node() : next(nullptr) {}
        Node(const int num) : data(num), next(nullptr) {}
    };

private:
    Node * head;
    Node * tail;

public:
    SingleLinkedList();
    ~SingleLinkedList();
    void insert(T const& value);
    void displayList(std::ostream& stream = std::cout);
    friend std::ostream& operator<<(std::ostream& os, const SingleLinkedList& list);
};

template <typename T>
void SingleLinkedList<T>::displayList(std::ostream& stream){
    Node * temp = nullptr;
    temp = head;

    while(temp!=nullptr){
        stream << temp->data << " --> ";
        temp = temp->next;
    }
    stream << std::endl;
}

template <typename T>
std::ostream& operator<<(std::ostream& os, const SingleLinkedList<T>& list){
    list.displayList(os);
    return os;
}

int main(){

    SingleLinkedList<int> * myList = new SingleLinkedList<int>();

    myList->insert(10);
    myList->insert(20);
    myList->insert(30);
    std::cout << "Display function:" << std::endl;
    myList->displayList();

    std::cout << "Display - overloaded operator:" << std::endl;
    std::cout << myList << std::endl;

    delete myList;
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Много ошибок:

сначала удалите friend std::ostream& operator<<(std::ostream& os, const SingleLinkedList& list);, в этом нет необходимости

секунды, измените displayList на const (действительно, эта функция не изменяет список ион не должен - в общем случае всегда отмечать функцию, которая не должна изменять экземпляр, так как const - const функции могут быть вызваны для экземпляра const, как у вас внутри operator<<):

void displayList(std::ostream& stream = std::cout) const;

и

template <typename T>
void SingleLinkedList<T>::displayList(std::ostream& stream) const{

и, наконец, отображать список вместо указателя на список путем разыменования его:

std::cout << *myList << std::endl;
0 голосов
/ 18 мая 2018

Вы передаете myList в std :: cout.Эта переменная является указателем на список.

Чтобы распечатать сам список, необходимо разыменовать указатель:

std::cout << "Display - overloaded operator:" << std::endl;
std::cout << *myList << std::endl;
...