【问题标题】:C++ - << operator overloading, linked list - address instead of standard outputC++ - << 运算符重载,链表 - 地址而不是标准输出
【发布时间】:2018-05-18 08:30:06
【问题描述】:

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

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

你能解释一下我在哪里犯了错误吗?

我确信 displayList 函数是正确的。如果您还发现不正确的地方,请告诉我。

编辑: 如果我取消引用 myList,我会收到错误: 未定义对 `operator 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;
}

【问题讨论】:

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


【解决方案1】:

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

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

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

【讨论】:

  • 我之前试过了,但是我得到了错误:“undefined reference to `operator
【解决方案2】:

很多错误:

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

其次,将displayList更改为const(实际上,此函数不会修改列表,也不必-通常,始终将尚未修改实例的函数标记为@987654326 @ - const 可以为 const 实例调用函数,就像在 operator&lt;&lt; 中一样:

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

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

最后,通过取消引用来显示列表而不是指向列表的指针:

std::cout << *myList << std::endl;

【讨论】:

  • 非常感谢。我有点困惑。如何在没有声明的情况下使用带有运算符重载的函数?老实说,这是我第一次在行尾看到 const 。我总是在打字的开头看到它。是典型的还是特殊的?我想读一下,你有什么推荐的资源吗?
  • 这是典型的,见stackoverflow.com/questions/751681/…stackoverflow.com/questions/3141087/… 它只是通知编译器这个函数不会改变实例,所以它可以在实例不可变时调用(为了简化,当实例是const)。此外,当您尝试在const 函数中修改实例时,它会产生编译错误
猜你喜欢
  • 2021-01-06
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 2021-07-01
  • 2011-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多