9
votes

Utilisation de nouvel opérateur pour copier un objet sur le tas sans connaître son type

J'ai un doute, la fonction ci-dessous peut recevoir un objet de type A ou quelque chose de type dérivé. xxx

si nous l'appelons comme ceci: xxx < / pré>

L'objet pointé par HPTR est en réalité de type A ou B? Est sécuritaire de faire cela?


0 commentaires

6 Réponses :


5
votes

L'objet retourné est de type pointeur sur un , ce qui signifie que l'objet pointé par HPTR est de type A . Il n'est pas sûr car les méthodes d'appel ou les membres exclusives à B provoqueront un accident ou un comportement indéfini. Vous recherchez probablement le modèle d'usine .


0 commentaires

1
votes

Ce n'est pas sûr, il est incorrect et le compilateur devrait vous donner des diagnostics. Avez-vous essayé de compiler avec g ++ -wall si vous utilisez GCC?


1 commentaires

Désolé, j'ai écrit le code de la mémoire et je ne pouvais pas essayer de compiler.



8
votes

Lorsque vous faites ci-dessous dans votre code:

virtual A* MakeCopy();


0 commentaires

3
votes

Un moyen sûr est de fournir une méthode de clone virtuel xxx


0 commentaires

1
votes

ne compile pas: xxx

si vous modifiez le type de HPTR sur A * il compile, mais vous obtenez toujours un objet A . Le constructeur de copie par défaut pour A que vous utilisez créera un objet A et copier les champs de l'objet b qui ont été définis dans A , tranchez le B Partie OFF.


0 commentaires

0
votes

À cause de tous les problèmes décrits ci-dessus / dans ce post - si vous pouvez l'éviter (et je ne peux pas penser à une raison pour laquelle vous ne pouviez pas) - vous ne devez concevoir votre code pour exiger " CopytoHeap ".

Comme le souligne Luchian, vous voulez probablement une usine. L'usine crée votre objet sur le tas pour commencer (et retourne un pointeur intelligent pour gérer la durée de vie de l'objet / pointeur / mémoire).


0 commentaires