Question sur le masquage de la structure interne des classes
Résolu/Fermé
regitraz
Messages postés
89
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 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 24 mars 2020 à 12:46
mamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 24 mars 2020 à 12:46
A voir également:
- Question sur le masquage de la structure interne des classes
- Stockage interne - Accueil - Guide Android
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Structure d'un rapport de stage - Guide
- Ombre interne illustrator - Forum The Gimp
- Stockage interne autre ✓ - Forum Samsung
1 réponse
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
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