"朋友std :: ostream&operator <<(std :: ostream&out,LinkedList&list)"是什么意思?

Leg*_*eth 1 c++ friend linker-errors

因此,我获得了一个带有入门代码的作业来实现一个链表(我已经成功完成了未分类的双向链表),并且在给定头文件的入门代码中有一个朋友声明似乎有允许的目标我使用cout语句打印链表.这是头文件; 请注意,我在私人部分写了一切.

#ifndef _LINKED_LIST_
#define _LINKED_LIST_

#include <ostream>

class LinkedList
{
public:
    LinkedList();
    ~LinkedList();

    void add(char ch);
    bool find(char ch);
    bool del(char ch);

    friend std::ostream& operator<<(std::ostream& out, LinkedList& list);

private:
    struct node
    {
        char data;
        node * next;
        node * prev;
    };
    node * head, * tail;
};

#endif // _LINKED_LIST_
Run Code Online (Sandbox Code Playgroud)

main,这也是初学者代码的一部分,老师写道cout << list;,这让我相信头文件中的友元声明的目标是允许列表轻松地打印到控制台.通常我不在乎,但如果我不注释掉cout << list;语句,那么链接器会为每个实例提供以下错误cout << list;

app.o: In function 'main':
[code directory]/app.cpp:[line the statement is on]: undefined reference to
'operator<<(std::ostream&, LinkedList&)'
Run Code Online (Sandbox Code Playgroud)

我的问题是,什么friend std::ostream& operator<<(std::ostream& out, LinkedList& list)意思,为什么会cout << list;导致这个错误?代码在没有语句的情况下执行正常,因为我使用讲师的makefile来组合赋值,我认为这不是问题.

app.cpp如下

#include <iostream>
#include "linkedlist.h"

using namespace std;

void find(LinkedList& list, char ch)
{
    if (list.find(ch))
        cout << "found ";
    else
        cout << "did not find ";
    cout << ch << endl;
}

int main()
{
    LinkedList  list;

    list.add('x');
    list.add('y');
    list.add('z');
    cout << list;
    find(list, 'y');

    list.del('y');
    cout << list;
    find(list, 'y');

    list.del('x');
    cout << list;
    find(list, 'y');

    list.del('z');
    cout << list;
    find(list, 'y');

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

son*_*yao 10

什么friend std::ostream& operator<<(std::ostream& out, LinkedList& list)意思

这里的friend声明首先声明一个非成员函数,并使其成为类的朋友,这意味着它可以访问类的私有和受保护成员LinkedList.

为什么会cout << list;导致此错误?

由于它只是一个声明,您需要自己定义它.这就是为什么你得到一个未定义的引用链接错误.

你可以在类中定义它(即内联定义)

class LinkedList
{
    ...
    friend std::ostream& operator<<(std::ostream& out, LinkedList& list) {
        // output something
        return out;
    }
    ...
};
Run Code Online (Sandbox Code Playgroud)

或者在课外定义它:

std::ostream& operator<<(std::ostream& out, LinkedList& list) {
    // output something
    return out;
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句:我建议你做第二个参数类型const LinkedList&; 它不应该在里面修改operator<<.

  • @LegionDaeth`list.node`应该是`LinkedList :: node`; (2认同)