Question sur le masquage de la structure interne des classes
Résolu/Fermé
regitraz
Messages postés
92
Date d'inscription
vendredi 17 octobre 2014
Statut
Membre
Dernière intervention
30 mai 2021
-
Modifié le 15 janv. 2020 à 17:28
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 24 mars 2020 à 12:46
mamiemando Messages postés 32283 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 17 mars 2023 - 24 mars 2020 à 12:46
A voir également:
- Question sur le masquage de la structure interne des classes
- Dans la table des matières de ce document, le chapitre 6 et ses 2 sections n'apparaissent pas. trouvez l'erreur dans la structure du document et corrigez-la. mettez à jour la table des matières. quel est le mot formé par les lettres en majuscules de la table des matières après sa mise à jour ? - Forum Word
- Transformer lecteur dvd interne en externe ✓ - Forum Disque dur / SSD / Clé USB
- 'Ls' n’est pas reconnu en tant que commande interne - Forum Windows
- Ajoutez à la liste de contacts ana le goff, inscrite le 27 novembre 2015, dans la catégorie i. puis triez les contacts en les classant : par ordre alphabétique de leur nom de famille (critère principal), puis par date du plus récent au plus ancien (critère secondaire). quel mot apparaît à la verticale dans la colonne "catégorie" entre les lignes 200 et 209 (en-tête compris) ? ✓ - Forum Word
- Stockage interne autre ✓ - Forum Samsung
1 réponse
mamiemando
Messages postés
32283
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
17 mars 2023
7 572
24 mars 2020 à 12:46
24 mars 2020 à 12:46
Bonjour,
En C et en C++, il est possible de déclarer un type (sur la base d'un autre type).
Exemples :
En C++, il est possible de déclarer un type à l'intérieur d'une classe ou d'une structure. C'est ce qui est fait avec :
Ainsi, utiliser
L'opérateur
Comme le type
L'opérateur
Quel est l'intérêt ?
Dans l'absolu, on sent qu'on aura besoin du type de la cellule par exemple dans la méthode qui retournera le i-ème élément de la liste. Sans
On sent que ça n'est pas très élégant d'une part, et surtout si un jour on veut changer
En déclarant le type
On peut donc adapter l'implémentation de
Pour aller plus loin
L'opérateur
Ici on peut donc tout a fait parler de
Bonne chance
En C et en C++, il est possible de déclarer un type (sur la base d'un autre type).
Exemples :
typedef int toto_t; typedef int * pointeur_t;
En C++, il est possible de déclarer un type à l'intérieur d'une classe ou d'une structure. C'est ce qui est fait avec :
class Liste {
...
typedef Cell * Place;
...
}
Ainsi, utiliser
Placeou
Cell *à l'intérieur de la classe
Listea le même sens.
L'opérateur
::
Comme le type
Placeest dans la classe, c'est un nom "relatif". Depuis l'extérieur de
Listeil faut donc utiliser son nom absolu. Pour cela, le C++ a introduit (par rapport au C) un nouvel opérateur :
::. Celui-ci se comporte comme
/pour un chemin. Sauf qu'au lieu d'écrire
/Liste/Placeon écrit
::Liste::Placeou plus simplement
Liste::Place.
L'opérateur
::s'applique aux classes, structures, mais aussi aux espaces de nommage (voir mot clé
namespace).
Quel est l'intérêt ?
Dans l'absolu, on sent qu'on aura besoin du type de la cellule par exemple dans la méthode qui retournera le i-ème élément de la liste. Sans
typedef, cette méthode aurait les signatures :
Cell * Liste::get(int i) const { ... }
const Cell * Liste::get(int i) const { ... }
On sent que ça n'est pas très élégant d'une part, et surtout si un jour on veut changer
Cellpar
Cellule, cela impactera non seulement le code de
Listemais aussi tout le code qui utilise
Liste. On voit alors que le fait d'utiliser
Cellest un détail d'implémentation.
En déclarant le type
Place, on abstrait le code extérieur à
Listede ce détail, car la signatures deviennent :
Place Liste::get(int i) const { ... }
const Place Liste::get(int i) const { ... }
On peut donc adapter l'implémentation de
Liste::Placesans affecter le reste du code.
Pour aller plus loin
L'opérateur
::peut, à l'image de
/, être enchaîné. Ainsi voici à quoi ressemble la liste standard du C++ :
namespace std {
template <typename T>
class list {
public:
typedef ... iterator;
typedef ... const_iterator;
...
};
}
Ici on peut donc tout a fait parler de
std::list<int>::iteratorou
std::list<int>::const_iterator.
Bonne chance

