Salut à toutes et à tous !
Je reviens vous embêter un chouïa...
Quand j'ai commencé le C++ (il y a ... houla, au moins 4 mois ) j'ai suffisamment lu des phrases du style "utiliser les références partout où vous devez, et les pointeurs quand vous pouvez pas faire autrement" pour tenter d'appliquer ce principe à la lettre. Donc j'ai mis des références partout où j'avais besoin de polymorphisme : dans les constructeurs, dans les données membres... Je partais du seul principe que pour peu que l'instance existe déjà, je peux utiliser une référence sur son type ancêtre pour activer le polymorphisme, et basta.
Et ça a marché un temps.
J'avais bien fait un ou deux new à un moment, mais comme je ne savais pas exactement comment gérer la mémoire, que je préfère ne pas faire les choses plutôt que de les faire salement, j'ai choisi de mettre aucun delete, en attendant que ça me retombe sur la tronche pour m'en occuper sagement/proprement. ça n'a pas tardé, on est en plein dedans.
Donc là j'ai commencé à arpenter pas mal de sites sur les références, les pointeurs, les pointeurs intelligents etc. J'ai commencé à voir que mon principe d'utilisation (objet déjà instancié + polymorphisme requis = reference) était pas si bon que ça, qu'il y avait aussi un truc appelé "ownership", qu'on finit bien par avoir besoin de créer un objet dynamiquement, et qu'il faut bien le détruire à un moment où à un autre et que la destruction est un grand pouvoir impliquant de graaandes responsabilités.
J'ai aussi lu que si une fonction utilisait une référence sur un objet, elle "renonçait" à sa propriété. C'est le point qui précisément m'inquiète. Parce que j'ai fait de la composition en folie, en utilisant des références sur les composantes. Je me rend bien compte que par le jeu des références il est bien maladroit de détruire les membres-composantes via le destructeur de l'objet-composite.
Typiquement, dans le code suivant, les membres/composants peuvent être de plusieurs types, donc j'avais besoin de polymorphisme. D'un autre côté, au moment de construire un objet A, je savais exactement de quelle classe héritant de J j'avais besoin. Donc j'ai codé ça avec des références sur J, en laissant à un builder le soin de construire dynamiquement les composantes c1 et c2 selon les options que je lui donne, puis de les filer au constructeur de A.
Seul souci : qui détruit ces objets c1 et c2 au final ? Je pense que c'est à A de les détruire, parce que sortis de A, c1 et c2 n'ont aucun sens. Mais si c'est le cas, va falloir que je modifie toutes mes interfaces/tests/implémentations ?
Donc est-ce que je remplace toutes les références sur les composantes par des pointeurs ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 class A :{ public: A(J & c1, J & c2); virtual ~A(); protected: private: J& m_c1; J& m_c2; };
Merci d'avance de votre réponse,
Bien cordialement,
Partager