Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
semantique_d_entite [2015/02/16 16:21] woly [Constructeur et destructeur] |
semantique_d_entite [2018/07/20 23:36] (Version actuelle) winjerome Ajout du lien vers la chapitre suivant |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
- | ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^ | + | ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[heritage|Chapitre suivant]] ^ |
====== La sémantique d'entité ====== | ====== La sémantique d'entité ====== | ||
Ligne 85: | Ligne 85: | ||
Idem pour le destructeur, si on n'en fournit pas, le compilateur proposera un destructeur par défaut. | Idem pour le destructeur, si on n'en fournit pas, le compilateur proposera un destructeur par défaut. | ||
- | Le plus souvent, ces constructeurs et destructeur seront publics, mais il peut être intéressant de les mettre en privée. Dans ce cas, il ne sera pas possible de créer ces objets directement en appelant le constructeur. On pourra alors créer par exemple une fonction (ou classe) dédiée pour la création des objets (voir le design pattern //factory//). Il faudra alors mettre cette fonction (ou classe) en ''friend'' pour qu'elle soit autorisée à accéder aux membres privés. | + | Le plus souvent, ces constructeurs et destructeur seront publics, mais il peut être intéressant de les mettre en privé. Dans ce cas, il ne sera pas possible de créer ces objets directement en appelant le constructeur. On pourra alors créer par exemple une fonction (ou classe) dédiée pour la création des objets (voir le design pattern //factory//). Il faudra alors mettre cette fonction (ou classe) en ''friend'' pour qu'elle soit autorisée à accéder aux membres privés. |
<code cpp> | <code cpp> | ||
Ligne 115: | Ligne 115: | ||
==== Opérateurs de comparaison ==== | ==== Opérateurs de comparaison ==== | ||
- | De la même façon, cela n'a pas de sens de comparer des classes à sémantiques d'entité, puisque par définition, tous les objets sont différents. Cela n'a donc pas de sens de vouloir par exemple déterminer quel objet est supérieur à un autre. Par contre, il est possible de comparer les objets selon d'un de ses membres qui serait à sémantique de valeur. Par exemple, les chaises peuvent être comparés selon leur poids ou leur taille, les fenêtres peuvent être comparées selon leur position ou leur dimension. | + | De la même façon, cela n'a pas de sens de comparer des classes à sémantiques d'entité, puisque par définition, tous les objets sont différents. Cela n'a donc pas de sens de vouloir par exemple déterminer quel objet est supérieur à un autre. Par contre, il est possible de comparer les objets selon d'un de ses membres qui serait à sémantique de valeur. Par exemple, les chaises peuvent être comparées selon leur poids ou leur taille, les fenêtres peuvent être comparées selon leur position ou leur dimension. |
<code cpp> | <code cpp> | ||
Ligne 136: | Ligne 136: | ||
</code> | </code> | ||
- | Il est donc préférable de désactiver explicitement ces opérations, pour éviter de réaliser ces tests. Comme par défaut, seul les opérateurs ''=='' et ''!='' sont définies, il faut les désactiver. | ||
- | <code cpp> | + | <note info>On pourrait penser que puisque ces tests ne posent pas de problèmes particuliers, on pourrait quand même les conserver, même s'ils retournent un résultat prévisible. En pratique, avec la notion d'héritage que vous verrez dans le prochain chapitre, l'implémentation de ces fonctions n'est pas trivial. Il est donc pertinent de les désactiver, pour éviter les problèmes de comparaison que poserait les fonctions créées par défaut par le compilateur. |
- | class MyClass { | + | |
- | public: | + | |
- | bool operator==(MyClass const&) = delete; | + | |
- | bool operator!=(MyClass const&) = delete; | + | |
- | }; | + | |
- | </code> | + | |
- | + | ||
- | <note info>On pourrait penser que puisque ces tests ne posent pas de problèmes particuliers, on pourrait quand même les conserver, même s'ils retournent un résultat prévisible. En pratique, avec la notion d'héritage que vous verrez dans le prochain chapitre, l'implémentation de ces fonctions n'est pas trivial. Il est donc pertinent de les désactiver, pour éviter les problèmes de comparaison que poserait les fonctions créée par défaut par le compilateur. | + | |
Il sera parfois intéressant de pouvoir quand même tester l'unicité des entités, mais cette problématique ne sera pas forcement simple. Nous reviendrons sur ce problème dans un prochain chapitre.</note> | Il sera parfois intéressant de pouvoir quand même tester l'unicité des entités, mais cette problématique ne sera pas forcement simple. Nous reviendrons sur ce problème dans un prochain chapitre.</note> | ||
Ligne 158: | Ligne 149: | ||
On voit que les classes à sémantique d'entité interdisent de nombreuses fonctions de base que l'on a rencontré dans les classes à sémantiques de valeur (redéfinir des opérateurs de comparaison ou des opérateurs arithmétiques). L'intérêt de cette sémantique sera qu'elle autorise l'héritage de classe, que nous allons voir dans le prochain chapitre. | On voit que les classes à sémantique d'entité interdisent de nombreuses fonctions de base que l'on a rencontré dans les classes à sémantiques de valeur (redéfinir des opérateurs de comparaison ou des opérateurs arithmétiques). L'intérêt de cette sémantique sera qu'elle autorise l'héritage de classe, que nous allons voir dans le prochain chapitre. | ||
- | ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ Chapitre suivant ^ | + | ^ Chapitre précédent ^ [[programmez_avec_le_langage_c|Sommaire principal]] ^ [[heritage|Chapitre suivant]] ^ |
{{tag> Cours C++}} | {{tag> Cours C++}} |