Je suis nouveau en C++ et j'ai essayé de me familiariser avec la langue en implémentant une LinkedList.Un membre de classe C++ accédé via getter génère des erreurs, un accès direct ok mais std :: cout interfère?
class ListElement {
public:
int val;
ListElement *next;
ListElement(int v, ListElement *n) {val = v; next = n;};
};
ListElement
contient une valeur d'int val
et un pointeur vers l'élément suivant de la liste (nullptr
s'il n'y a pas d'élément suivant) et un constructeur.
class MyLinkedList {
public:
ListElement *head;
MyLinkedList() {head = nullptr;};
ListElement* getHead(void){
return head;
};
void append(int i) {
head = &ListElement(i, head);
};
};
MyLinkedList
contient un pointeur vers le premier élément de la liste nommée head
ainsi que des méthodes de travail sur la liste. En rencontrant quelques bugs dans ces méthodes j'ai essayé de traquer leur cause. (Je suis conscient qu'un getter pour un membre de la classe publique n'a pas de sens du tout, à l'origine head
était privé.) Ce faisant, j'ai observé le comportement suivant, je ne peux pas expliquer:
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;
}
L'exécution de ce code (ajouter #include <iostream>
et using namespace std;
pour un exemple de travail) imprime
head: 1
getHead(): 18085840
head: -858993460
si le premier accès direct head
fonctionne exactement comme prévu, ce qui donne 1
comme valeur du premier élément de la liste, mais en utilisant le getter retourne ordures. Si head
est alors accessible directement à nouveau, il donne aussi des déchets, ce qui me fait penser à « Hm, semble comme l'utilisation getHead() tronque en quelque sorte l'objet ListMember », juste pour découvrir que
int x = l.head->val;
cout << "head: " << x << "\n";
int z = l.head->val;
cout << "head: " << z << "\n";
impressions
head: 1
head: -858993460
sans même toucher le getter. Donc, est-ce simplement en accédant à l.head
d'une manière suffisante pour le brouiller?
Non, comme
int x = l.head->val;
int z = l.head->val;
cout << "head: " << x << "\n";
cout << "head: " << z << "\n";
retours (comme prévu) head: 1
deux fois. Donc en utilisant cout
entre les changements mes objets ou leurs pointeurs? Et quel est le problème avec getHead()
comme tout ce qu'il fait est juste return head;
?
Donc, je suis assez perdu ici et je n'ai pas trouvé de questions directement liées. (This Question a un titre prometteur mais n'utilise pas de pointeurs). Suis-je totalement incapable d'utiliser les pointeurs de manière correcte? Ou y a-t-il une suppression automatique des objets dans les coulisses? Ou est-ce juste comment magiC++ fonctionne?
'head = & ListElement (i, head);' - ce n'est pas comme cela que vous allouer un 'ListElement'. Allez lire à propos de 'new' (et dans la plupart des cas, essayez d'éviter d'en avoir besoin). – user2357112
pour faire bonne mesure, vous pouvez également vouloir savoir sur [pointeurs intelligents] (http://stackoverflow.com/questions/106508/what-is-a-smart-pointer-and-when-should-i-use-one – jaggedSpire
@jaggedSpire Droit, mon mauvais - trop tard pour penser directement je suppose: \ – jpw