Class Noeud et allocation dynamique

Class Noeud et allocation dynamique

by Matthieu Camille Bossert -
Number of replies: 2

Bonjour,

Dans la dernière méthode du cours de vendredi sur "Comment représenter un graphe à l’aide de vector(s)" (2ième stratégie avec des pointeurs (gérable)), il est mentionné que "Chaque nœud est alloué dynamiquement avec new".

Concrètement comment fait-on pour initialiser une instance de classe en lui allouant de la mémoire dynamiquement?
Est-ce que cela revient à avoir une classe ayant pour attribut des pointeurs et ensuite allouer dynamiquement de la mémoire pour chacun de ses pointeurs dans le constructeur? Dans ce cas là, est-il toujours possible d'utiliser la liste d'initialisation?

Est-ce que l'instance en elle même existe dans une zone mémoire allouée dynamiquement sur le tas (heaps)?


Enfin, en quoi cela-est-il préférable à simplement créer un instances contenant des attributs de type concret?

Merci pour votre aide.

Matthieu Bossert


In reply to Matthieu Camille Bossert

Re: Class Noeud et allocation dynamique

by Ronan Boulic -

la syntaxe de new vue au premier semestre s'utilise aussi pour allouer une instance d'une classe.

Il n'y a pas besoin d'écrire un constructeur spécial pour permettre à une instance d'être allouée dynamiquement.

reprenons l'exemple p70 du BOOC du sem1 ; il fait l'allocation dynamique d'un int:

int* ptr(nullptr); // ptr est un pointeur vers un int

ptr = new int(1234);

un int de valeur initiale 1234 est alloué dynamiquement avec new ; l'adresse renvoyée est affectée à ptr.

C'est la même approche pour allouer dynamiquement une instance d'un type Noeud:

Noeud* ptr2(nullptr);  // ptr2 est un pointeur sur un Noeud

ptr2 = new Noeud(a,b,c) ;

un Noeud est alloué dynamiquement et initialisé avec un constructeur de la classe Noeud qui demande 3 paramètres a,b,c

Si on n'ajoute rien après le nom du type, c'est le constructeur par défaut qui est appelé, comme dans une déclaration habituelle.



In reply to Ronan Boulic

Re: Class Noeud et allocation dynamique / second rappel

by Ronan Boulic -

si ptr2 pointe sur un Noeud, alors (*ptr2) désigne le Noeud pointé par ptr2 et je peux accéder à un champ de ce Noeud avec l'opérateur .

Par exemple pour accéder à la valeur d'un champ s'appelant uid :

(*ptr2).uid 

Cependant cette écriture est lourde, c'est pourquoi le cours utilise l'opérateur -> comme ceci:

ptr2->uid