2016-12-26 3 views
-2

J'étudie le C++ du livre de Herbert Schildt "Teach Yourself C++ 3rd Edition". Dans un exemple de code, quelque chose me rendait si confus. Je n'ai pas écrit tout le code dans l'exemple, je n'ai écrit que la déclaration de classe. Ici, je n'ai pas compris une partie. Tout d'abord, le pointeur "* node" qui appartient à la fonction "add", utilise comme "node-> next" le pointeur "* next". Je n'ai pas compris le but ici, pourquoi nous n'utilisons pas directement comme {"next = this; next = 0;}? Aussi, comment pouvons-nous utiliser un pointeur vide (* node) pour pointer un autre pointeur vide (* ? prochaine) Je manque peut-être quelques concepts clés, merci pour aideC++ en utilisant un pointeur pour pointer un autre pointeur

+3

Voici une belle liste de [C++ livres] (http://stackoverflow.com/questions/388242/the -definitive-c-book-guide-and-list). Je voudrais sauter un livre qui prêche ce câblage struct si populaire auprès des universités. Utilisez des conteneurs STL à la place. –

+0

Vous avez un pointeur sur une 'liste', qui contient un pointeur vers une autre' liste', qui contient un pointeur vers une autre 'liste' ... c'est la manière normale des listes-liées. Mais vous serez beaucoup plus heureux en utilisant 'std :: list' de la bibliothèque standard que de l'utiliser! –

Répondre

0

Dans la fonction add().

template<typename data_t> 
class list { 
    // ... 
    void add(list *node) {node->next = this; next = 0; } 
    // ... 
}; 

le point de la fonction est d'ajouter this à la liste, comme l'élément suivant après node Pensez-y comme un train: add() dit à la voiture actuelle de se brancher sur le dos d'une autre voiture, avec le paramètre de la fonction indiquant la voiture à laquelle se lier
Notez que cette fonction attend node à pas être un pointeur nul; si elle est nulle, vous aurez probablement une erreur de segmentation.

void add(list* node) { 
    node->next = this; // Tells "node" to register the current node as its "next" node. 
         // Should first check whether "node" is a valid pointer. 
    next = 0;   // Tells the current node to register a null pointer as its "next" node, 
         // signifying that it's currently the last node in the list. 
         // Note that instead of assigning 0, it should instead assign either 
         // "nullptr" (C++11 or later) or "NULL" (pre-C++11). 
} 

Par conséquent, lorsqu'il est utilisé comme ceci:

list<int> start(42), second(24); 
second.add(&start); 

Il va effectuer les opérations suivantes:

(&start)->next = &second; 
(&second)->next = 0; 

Cela crée une liste chaînée, qui ressemble à ceci:

Start: "start" 
    --> Next: "second" 
    --> Next: None. 

Ou, plus concis:

start->second->NULL 

Rappelez-vous, quand à l'intérieur d'une fonction de membre non-statique, aucun accès variables membres sont supposés fonctionner sur this, sauf indication contraire.

template<typename data_t> 
void list<data_t>::add(list* node) { 
    node->next = this; // Operates on node, not on this. 
    next = 0;   // Operates on this; becomes "this->next = 0;" 
} 

Si cette fonction intstead était {next = this; next = 0;}, il serait:

template<typename data_t> 
void list<data_t>::add(list *node) { 
    this->next = this; // Bad. Creates a circular linked list, where "this" is ALWAYS the 
         // next node after "this". 
    this->next = 0; // Renders the above line entirely pointless, by indicating that there 
         // are no nodes after "this". 
}