Also bekam ich eine Aufgabe mit Starter-Code, um eine verkettete Liste zu implementieren (was ich mit einer unsortierten doppelt verknüpften Liste erfolgreich gemacht habe) und im Starter-Code in der angegebenen Header-Datei gab es eine Friend-Deklaration, die das Ziel zu haben scheint damit ich die verknüpfte Liste mit der cout
-Anweisung drucken kann. Dies ist die Header-Datei. Beachten Sie, dass ich alles im privaten Bereich geschrieben habe.Was bedeutet "friend std :: ostream & operator << (std :: ostream & out, LinkedList & list)"?
#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_
In main
, die auch Teil des Starters Code war, schrieb der Lehrer cout << list;
die mich führt das Ziel der Freund-Anweisung in der Header-Datei zu glauben, war Liste zu ermöglichen leicht an die Konsole zu drucken. Normalerweise würde ich nicht egal, aber wenn ich kommentiert Sie nicht die cout << list;
Aussagen dann der Linker gibt mir die folgenden Fehler für jede Instanz von cout << list;
app.o: In function 'main':
[code directory]/app.cpp:[line the statement is on]: undefined reference to
'operator<<(std::ostream&, LinkedList&)'
Meine Frage ist, was bedeutet friend std::ostream& operator<<(std::ostream& out, LinkedList& list)
bedeuten und warum tut cout << list;
diesen Fehler verursachen? Der Code läuft gut ohne die Anweisungen und da ich das Makefile des Instruktors verwende, um den Auftrag zusammenzustellen, denke ich, dass das nicht das Problem ist.
app.cpp ist als
#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;
}
Es bedeutet, dass Sie deklariert, friended, und am wichtigsten, sind * mit * 'std :: ostream & operator << (std :: ostream & out, LinkedList & Liste);', aber nie wirklich * definiert * es in einer Übersetzungseinheit das ist mit deinem Code verbunden. Erklären, dass es der erste Schritt war; Sie müssen es noch implementieren. Unabhängig davon sollte der zweite Parameter idealerweise ein const-Verweis und nicht nur ein Verweis sein, da Ausgabeoperatoren das zu schreibende Objekt nur selten ändern. – WhozCraig