« Langage C++/Structures, unions et champs de bits » : différence entre les versions

Une page de Wikiversité, la communauté pédagogique libre.
Contenu supprimé Contenu ajouté
Ppignol (discussion | contributions)
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 175 : Ligne 175 :
long Valeur;
long Valeur;
char* Chaine;
char* Chaine;
};
//....
}TestUnion;
</source>
}}

{{exemple|contenu=
<source lang="cpp">

typedef struct TestStruct
{
short PoidFaible;
short PoidFort;
}TestStruct;

typedef struct TestUnion
{
private:
union // Ici l'union permet de lire l'int ou de lire que sa partie haute (TestUnion.Decoupe.PoidFort) ou
{ // sa partie basse(TestUnion.Decoupe.PoidFaible).
// Ce genre d'union est plus intéressante mais il est possible de faire mieux avec des classes
// pour obtenir le même résultat et l'avantage sera la clarté des méthodes de classes comparé
// à l'opacité de l'union.
public:
int Valeur;
TestStruct Decoupe;
};
};
//....
//....

Version du 17 février 2009 à 12:44

Début de la boite de navigation du chapitre
Structures, unions et champs de bits
Icône de la faculté
Chapitre no {{{numéro}}}
Leçon : Langage C++
Chap. préc. :Enumérations
Chap. suiv. :Objet
fin de la boite de navigation du chapitre
En raison de limitations techniques, la typographie souhaitable du titre, « Langage C++ : Structures, unions et champs de bits
Langage C++/Structures, unions et champs de bits
 », n'a pu être restituée correctement ci-dessus.

Structures, unions et champs de bits

Les structures existent en C++ uniquement pour la compatibilité ascendante et ne servent plus qu'à quelques cas spécifique comme les unions, les champs de bits et quelques applications matérielles mais même dans ces circonstance il est possible de trouver des alternatives plus "Objet".

Le but principal de la structure était de regrouper et de mieux gérer les données qui avaient des affinités communes dans un langage qui ne disposait pas d'autres moyens (hormis l'énumération) pour organiser les données d'un programme.

Le gros problème avec les structures c'est que ce sont des "#define" autrement dit ce sont des macros. Le code est expansé à chaque définition de variable si on les utilise tels quelle. Heureusement il est possible de typer les structures au moyen de la directive de compilation "typedef". Grâce à cette astuce la structure n'est plus expansée, on peut utiliser le casting et l'auto-référencement est facilité.

En C++ la structure à été remplacé avantageusement par la classe mais nous verrons cela un peu plus tard.

Il existe trois catégories de structures :

  • Les structures simples,
  • Les unions,
  • Les champs de bits.

Les Structures Simples

En C++ la structure simple à évoluée pour suivre un modèle plus "orienté objet" désormais il est possible et conseillé d'inclure les méthodes qui manipulent les données de la structure dans la structure elle même. Chose qui était impossible en C.


Où <NomStructure> (optionel) est le nom interne de la structure, <StructureParente> (optionel) est le nom de la structure parente, <Visibilite> (optionel) déclare la visibilité des membres (parmis private, protected et public, par défaut : public), <TypeChamp1> est le type du premier champ ayant pour nom <NomChamp1>, <TypeChampN> est le type du dernier champ ayant pour nom <NomChampN>, <TypeMethod1> est le type de la première méthode <NomMethod1> ayant pour paramétrés <ParametresMethod1>, <TypeMethodN> est le type de la dernières méthode <NomMethodN> ayant pour paramètres <ParametresMethodN> et <NomTypeStructure> est le type de la structure

Début de l'exemple
Fin de l'exemple


Alternative à la structure

En fait je l'ai déjà dit la structure à été avantageusement remplacée par la classe déclaré par le mot clé class.

Les Unions

Les unions permettent de créer des espaces mémoire où l'on peut interpréter une même donnée de différentes manières ou de diviser une même donnée en sous ensembles. En fait une union déclare la disposition tous ses membres en partant de la même adresse contrairement à la structure qui dispose ses membres les uns à la suite des autres.

Les unions ne sont pas à proprement parler des structures. Utilisés telles quelles elles ne permettent pas l'héritage mais il existe un moyen de contourner cet obstacle. Il est possible de créer des unions non nommées, cela permet de déléguer la manipulation des membres directement à la portée supérieure. Sachant cela il suffit d'encapsuler une union dans une structure typée pour rendre l'héritage possible. Cela implique cependant qu'il sera impossible de créer un constructeur ou des méthodes non inlinées au niveau de l'union. Pour des raisons de lecture il sera donc préférable de déléguer la gestion des méthodes de l'union à la portée supérieure (soit la structure dans notre cas). Cela exige aussi que tous les attributs de l'union soient déclaré comme public.


Où <NomStructure>(optionnel) est le nom interne de la structure d'accueil, <TypeChamp1> et <TypeChampN> sont les types des champs respectivement <NomChamp1> et <TypeChampN>, <NomTypeStructure> est le nom du type de la structure.

Début de l'exemple
Fin de l'exemple


Début de l'exemple
Fin de l'exemple