J'aurais tendance à dire :
ouLa classe que je m'apprête à créer a-t-elle vocation à se trouver dans une hiérarchie d'héritage ou non
En effet, si une classe a vocation à se retrouver dans une hiérarchie de classe ou si elle est caractérisée plus par ses comportements que par les valeurs qui la composent, elle aura sémantique d'entité, étant donné que ce qui importe, ce n'est pas la valeur qu'elle représente mais bel et bien les comportements que l'on en attendLa classe que je m'apprête à créer se caractérise-t-elle par les valeurs qui la représente ou par les comportement que l'on en attend
Effectivement, ta classe Map prendra sémantique d'entité.Car, récemment, j'ai utilisé une classe Map (une carte 2D pour un jeu de tuiles) qui contient deux std::vector, un pour les tuiles, un pour les unités.
Mon problème, c'est que l'on pourrait chercher à redéfinir l'opérateur == que cela fonctionnerai. (Mais pas les autres opérateurs, comme désigné dans la FAQ).
Donc j'imagine que cela prendra une sémantique d'entité, mais je ne suis pas sur à 100%
La meilleure preuve en est que l'on peut parfaitement envisager un cas où, selon les besoins que tu as définis par ailleurs, ta classe serait dérivée en Map2D d'un coté et Map3D de l'autre.
Cependant, il est fort vraissemblable que la classe (de base) Map ne fasse qu'exposer une interface publique, basée sur des fonctions virtuelles --dont une bonne partie seraient d'ailleurs virtuelles pures -- ne serait-ce que parce qu'il n'est pas exclu que certains comportements méritent alors d'être adapté au type réel de la map ou que les données soient de types différents
Tu n'es absolument pas obligé de recourrir à l'allocation dynamique, pour autant:Et puis, je voulais savoir, si j'ai une classe à sémantique d'entité, que je veux la créer juste pour une fonction (durée de vie d'une fonction) dois-je obligatoirement utilisé un pointeur ou une référence, ou puis-je utiliser un type statique afin que le programme détruise la classe tout seul, sans que je ne m'en préoccupe.
- que tu aie la certitude que la durée de vie de l'objet ne dépasse pas la portée dans laquelle il est créé
- que tu saches à l'avance, et sans ambiguité, exactement le type d'objet dont tu auras besoin
- Que tu veilles à passer l'objet créé sous la forme d'une référence ou d'un pointeur (que tu obtiens avec l'opérateur "address of" ( & ) ) si la fonction attend un objet du type de bas
Mon métier est de te dire que rien n'est impossible , mais bon, cela nou lancerait sanss doute dans une répétition de cours de POOFinalement, il serait bien d'avoir une sorte de méthode que l'on lirai pour savoir comment construire une classe proprement (genre, une liste de questions qu'ils faut toujours se poser). Car il me semble que ce ne soit pas si simple. Est-ce possible ?
Ceci dit, il y a, effectivement quelques questions qui devraient te permettre de savoir si tu as affaire à une classe ayant sémantique d'entité :
Si tu réponds oui à l'une de ces questions, tu est très clairement face à une classe ayant sémantique d'entité, et il est plus que vraissemblable qu'elle puisse avantageusement être non copiable et non assignable (avoi unconstructeur par copie et un opérateur d'affectation privé)
- Dois je prévoir de faire cohabiter des instances de plusieurs types différents dans une seule et même collections d'objets de sorte à les parcourir tous en invoquant un certain nombre de comportements clairement définis
- Puis-je réellement dire en toute honnêteté que l'objet B EST UN objet de type A, dans toute la sémantique du terme, lorsque j'envisage l'héritage
- (comme déjà indiqué précédemment) La classe est elle caractérisée plus par les comportements que l'on en attend que par les valeurs qui la composent
Partager