C ++ - <<运算符重载,链表 - 地址而不是标准输出

时间:2018-05-18 08:30:07

标签: c++ c++11 templates operator-overloading

我正在尝试重载输出运算符。

程序编译,但不是输出(节点列表)它会打印一些地址。

你能解释一下我犯错的地方吗?

我确信displayList函数是正确的。如果你还看到不正确的东西,请告诉我。

修改: 如果我取消引用myList,我会收到错误: 未明确引用`operator<<(std :: ostream&,SingleLinkedList const&)' 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 :(得分:4)

您正在将myList交给std :: cout。该变量是指向列表的指针。

要打印出列表本身,您必须取消引用指针:

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

答案 1 :(得分:3)

许多错误:

首先,删除friend std::ostream& operator<<(std::ostream& os, const SingleLinkedList& list);,没有必要

第二,将displayList更改为const(事实上,此功能不会修改列表,并且它不必 - 一般来说,始终标记避开&的函数#39; t修改实例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;