Ich bin neu in C++ und habe versucht, mich mit der Sprache vertraut zu machen, indem ich eine LinkedList implementiere.C++ Klassenmitglied Zugriff über Getter ergibt Müll, direkter Zugriff ok aber std :: cout stört?
class ListElement {
public:
int val;
ListElement *next;
ListElement(int v, ListElement *n) {val = v; next = n;};
};
ListElement
enthält einen int Wert val
und einen Zeiger auf den nächsten Listenelement und ein Konstruktor (nullptr
wenn es keine nächste Element ist).
class MyLinkedList {
public:
ListElement *head;
MyLinkedList() {head = nullptr;};
ListElement* getHead(void){
return head;
};
void append(int i) {
head = &ListElement(i, head);
};
};
MyLinkedList
enthält einen Zeiger auf das erste Element des head
sowie benannte Liste als einige Methoden auf der Liste arbeiten. Bei einigen Methoden habe ich versucht, ihre Ursache zu finden. (Ich bin mir bewusst, dass ein Getter für eine öffentliche Klasse Mitglied macht keinen Sinn überhaupt, ursprünglich head
privat war.) Doing so beobachtete ich das folgende Verhalten kann ich nicht erklären:
int main() {
MyLinkedList l;
l.append(1);
int x = l.head->val;
cout << "head: " << x << "\n";
int y = l.getHead()->val;
cout << "getHead(): " << y << "\n";
int z = l.head->val;
cout << "head: " << z << "\n";
cin.get();
return 0;
}
diesen Code Running (hinzufügen #include <iostream>
und using namespace std;
für ein Arbeitsbeispiel) druckt
head: 1
getHead(): 18085840
head: -858993460
so die erste direkte Zugang von head
funktioniert wie erwartet, 1
als Wert des ersten Listenelement nachgebend, aber gibt den Getter mit Müll. Wenn head
dann direkt wieder zugegriffen wird, liefert es auch Müll, die ich gemacht denken „Hm, scheint wie mit getHead() irgendwie verstümmelt das ListMember Objekt“, nur um zu entdecken, dass
int x = l.head->val;
cout << "head: " << x << "\n";
int z = l.head->val;
cout << "head: " << z << "\n";
druckt
head: 1
head: -858993460
ohne den Getter zu berühren. Also einfach auf l.head
zugreifen, um es zu verunsichern? Kein
, als
int x = l.head->val;
int z = l.head->val;
cout << "head: " << x << "\n";
cout << "head: " << z << "\n";
Erträge (wie beabsichtigt) head: 1
zweimal. Also zwingt ich mit cout
zwischendurch meine Objekte oder ihre Zeiger? Und was ist los mit getHead()
als alles ist nur return head;
?
Also ich bin hier ziemlich verloren und keine direkt Fragen finden konnten. (This Question hat einen vielversprechenden Titel, aber keine Zeiger). Kann ich Zeiger nicht korrekt verwenden? Oder wird hinter den Kulissen eine automatische Objektlöschung ausgeführt? Oder funktioniert magiC++ so?
'head = & ListElement (i, head);' - so vergeben Sie kein neues 'ListElement'. Lies über "neu" (und versuche dann in den meisten Fällen, es zu vermeiden). – user2357112
für ein gutes Maß, möchten Sie vielleicht auch über [Smartpointer] (http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one) wissen) – jaggedSpire
@jaggedSpire Richtig, mein Schlechter - zu spät, um direkt zu denken, denke ich: – jpw