所以我被分配了一个带有启动代码的任务来实现一个链表(我已经成功地完成了一个未排序的双向链表)并且在给定头文件的启动代码中有一个朋友声明似乎有一个目标是允许我使用 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_
在 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&)'
我的问题是, 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;
}
原文由 Legion Daeth 发布,翻译遵循 CC BY-SA 4.0 许可协议
朋友声明 声明了一个非成员函数,并使其成为类的朋友,这意味着它可以访问
private
和protected
类的成员LinkedList
。由于它只是一个声明,因此您需要自己定义它。这就是为什么您会收到未定义的引用链接器错误。
您可以在类中定义它(并内联定义)
或者在类之外定义它:
顺便说一句:我建议您将第二个参数类型
const LinkedList&
;它不应该在operator<<
内修改。