Citation:
Envoyé par
Steph_ng8
Non mais quel égocentrique, celui-là ! :D
Fallait bien marquer les esprits :D
Citation:
Bon, j'ai compris d'où vient le problème.
Je comprends parfaitement votre raisonnement à tous les deux.
Ce qui pêche, c'est le point de départ.
D'un point de vue purement théorique, je ne vois pas pourquoi les classes d'une hiérarchie (à héritage public) ont forcément une sémantique d'entité.
Parce que l'héritage publique est une relation EST-UN, au sens sémantique du terme:
Un client est une personne : tu peux utiliser un client en ne le considérant "que" comme une personne si tu le souhaites, et si tu n'as pas besoin des fonctions propres à son status de client, tout en profitant éventuellement de l'adaptation de certains comportements.
Citation:
Cela ne me paraît pas absurde d'avoir deux objets différents (d'une telle hiérarchie) ayant la même valeur, et de les considérer comme « égaux ».
Ce qui est absurde, c'est d'avoir deux objets différents ayant strictement les mêmes valeurs...
Mettons que tu aies une hiérarchie de véhicules... Tu auras un grand nombre de voiture, mais, même si tu prend deux voiture de même marque, même modèle, même couleur et mêmes options, tu auras toujours quelque chose de discriminant te permettant de te rendre compte que c'est la voiture de Jean et non celle de Pierre : même en Belgique où les plaques minéralogiques sont rattachées à la personne et non au véhicule, il reste le numéro de chassis.
Le fait de rouler 1000 km avec la voiture ne va pas faire que, d'un coup, en arrive à créer une autre voiture, alors que, si tu as un point sur un système d'axes , si tu change la valeur de X, tu obtiens bel et bien un autre point!
Citation:
Cela ne me paraît pas non plus absurde de vouloir copier un tel objet.
Et si l'on essaie de copier un objet vers un objet d'une classe parente, eh bien tant pis, on tronque.
Justement, c'est absurde...
Imagine que nous fassions cela avec ton compte courent et ton compte d'épargne :
Tout deux hériteraient naturellement de "compte bancaire".
Le fait de faire varier leur solde ne crée pas un nouveau compte, et tu ne serais surement pas enchanté de constater que certains mouvements apparaissent sur ton compte parce qu'il a été copié, et qu'il y a donc confusion entre le tien et celui d'un autre (au niveau du numéro)!
Citation:
Il est vrai que je n'avais pas pensé aux problèmes de cohérence pointés par jblecanard.
Finalement, je crois que je n'ai pas une vision de suffisante de ce « problème » sur des cas concrets.
Alors je vais vous faire confiance.
Si, après mûre réflexion, jamais j'ai l'impression que cela a un sens de vouloir copier des objets polymorphique sur un cas concret, je vous le présenterai, histoire que vous m'expliquiez pourquoi ma conception est foireuse... :aie: :P
En attendant, réfléchis déjà aux cas que je viens de donner ;)
Citation:
Sinon, j'avais pris l'habitude d'écrire les « big four » quoi qu'il arrive.
Je crois que je vais me restreindre aux cas où c'est nécessaire. ;)
Pas plus tard qu'hier, j'ai eu un problème justement avec un opérateur d'affectation au boulot:
Il a été défini uniquement pour permettre un comptage de référence (car il y avait des fuites mémoires, fut un temps :P) et j'ai du modifier la classe pour lui permettre de fournir de nouveaux services...
C'est une classe qui n'est absolument pas polymorphe, et qui est utilisée sans jamais avoir recours à new ou à delete.
Conscient de ce fait, je rajoute un membre pour lui permettre de fournir les services supplémentaires que j'en attendais, et, lors des tests, je me suis arrachés les cheveux pendant 8 heures parce qu'il n'y avait rien à faire : mes nouveaux services ne fonctionnaient pas comme il le fallait.
Je te donnes en mille la raison de ce problème : j'avais veillé à initialier le membre dans les différents constructeurs (y compris dans le constructeur par copie), mais j'avais, simplement... oublié de faire l'affectation du nouveau membre dans l'opérateur d'affectation!!!
Petite cause, grands effets ;)
Je ne manques pourtant pas de pratique, mais j'ai quand même oublié de rajouter une petite ligne à l'opérateur d'affectation!
Peut etre as tu eu la chance de ne jamais avoir le cas, mais, si un jour ca t'arrive, tu risque de changer d'habitude très rapidement :D
Citation:
Ah, au fait, je peux utiliser l'instruction = default pour tout de même les écrire quoi qu'il arrive (histoire de bien montrer qu'ils sont là), ou c'est une mauvaise idée ?
Ce n'est utilisable qu'en C++2011...
De plus, je me dis que c'est surtout pour garder le parallèle avec le = delete :p
A titre personnel, je le ferais sans doute dés le moment où les big four ne doivent pas être publics : pour les rendre protégés pour que seule la classe dérivée puisse les appeler, voir privés avec des amitiés qui vont bien pour que seules certaines classes y aient accès, mais je ne le ferais sans doute pas si leur définition créée par le compilateur me convient : publics et non virtuel (pour le destructeur) :P
Maintenant, de là à dire que c'est une mauvaise idée, il y a de la marge :D