Я новичок в C++ и попытался ознакомиться с языком, реализовав LinkedList.C++ член класса, доступ к которому через getter дает мусор, прямой доступ ok, но std :: cout мешает?
class ListElement {
public:
int val;
ListElement *next;
ListElement(int v, ListElement *n) {val = v; next = n;};
};
ListElement
содержит значение val
Int и указатель на следующий элемент списка (nullptr
, если нет следующего элемента) и конструктор.
class MyLinkedList {
public:
ListElement *head;
MyLinkedList() {head = nullptr;};
ListElement* getHead(void){
return head;
};
void append(int i) {
head = &ListElement(i, head);
};
};
MyLinkedList
содержит указатель на первый элемент списка с именем head
, а также некоторые методы работы над списком. Столкнувшись с некоторыми ошибками в этих методах, я попытался отследить их причину. (Я знаю, что геттер для члена общественного класса не имеет никакого смысла, первоначально head
была частной.) Это я заметил следующее поведение я не могу объяснить:
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;
}
Выполнение этого кода (добавить #include <iostream>
и using namespace std;
для рабочего примера) печатает
head: 1
getHead(): 18085840
head: -858993460
поэтому первый прямой доступ head
работ так же, как ожидается, получая 1
в качестве значения первого элемента списка, но с использованием геттер возвращает мусор. Если head
затем получить доступ непосредственно снова, она также дает мусор, который заставил меня думать «Хм, кажется, что с помощью getHead() как-то искажает объект ListMember», только чтобы обнаружить, что
int x = l.head->val;
cout << "head: " << x << "\n";
int z = l.head->val;
cout << "head: " << z << "\n";
печатает
head: 1
head: -858993460
, даже не касаясь газопоглотителя. Так просто получить доступ к l.head
в любом случае достаточно, чтобы обмануть его?
Нет, как
int x = l.head->val;
int z = l.head->val;
cout << "head: " << x << "\n";
cout << "head: " << z << "\n";
возвращает (по их назначению) head: 1
два раза. Итак, используя cout
между изменениями моих объектов или их указателей? И что случилось с getHead()
, поскольку все, что он делает, это только return head;
?
Так что я довольно утерян здесь и не мог найти никаких связанных вопросов. (This Question имеет многообещающее название, но не использует указатели). Неужели я полностью не использую указатели правильно? Или происходит автоматическое удаление объекта за кулисами? Или это как работает magiC++?
'head = & ListElement (i, head);' - это не то, как вы выделяете новый элемент ListElement. Пойдите, прочитайте о 'new' (а затем для большинства случаев, постарайтесь избежать необходимости). – user2357112
для хорошей меры, вы также можете узнать о [умных указателях] (http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one) – jaggedSpire
@jaggedSpire Правильно, мое плохое - слишком поздно думать прямо, я думаю: \ – jpw