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<<.
| 归档时间: |
|
| 查看次数: |
5924 次 |
| 最近记录: |