std :: unique_ptr code> a 2 paramètres de modèle, dont le second est le deleter à utiliser. Merci à ce fait, on peut facilement alias un
unique_ptr code> à un type, ce qui nécessite un destructeur personnalisé (par exemple
SDL_Texture code>), de la manière suivante:
using SDL_TextureSharedPtr = MySharedPtr<SDL_Texture, SDL2PtrDeleter>;
4 Réponses :
Vous n'avez pas inclus, en option, héritage privé avec des directives code> copieuses pour exposer les fonctionnalités inchangées. P>
Il est plus simple que la réécriture de PTR partagé tandis que Usong une copie privée, mais vous permet d'écrire une réinitialisation code> personnalisée code> sans danger d'exposition. P>
Notez également que le PTR partagé a une conversion de CTR de PTR unique. Si vos fonctions d'usine créent des PTR uniques, ils peuvent être affectés à des PTR partagés si nécessaire, la commande correcte du Delier est utilisée. Éliminer les pointeurs bruts de votre code et le problème de réinitialisation disparaît. P>
@nicol il répond directement "Ai-je manqué un moyen plus simple d'éviter de devoir spécifier un Delier pour STD :: Shared_Ptr
@Yakk merci, voici un uppote. Pour être honnête, je devais google ce que vous entendez par «Copieux en utilisant code> directives pour exposer les fonctionnalités non modifiées», car je n'ai jamais rencontré
en utilisant code> utilisé pour exposer les méthodes de parents privés ( Je suppose que mes rencontres avec
privées code> héritage sont arrivées assez rarement en général). Ce Cette réponse est-elle effacée pour moi. Puis-je vous demander d'inclure un exemple d'échantillon de code, illustrant votre idée avec
en utilisant des membres parent code> ou un lien vers la réponse que j'ai mentionnée, au profit des autres, qui, comme moi, pourraient être dans le foncé.
@Terra Heh, j'ai dit que c'était une réponse non grande. ;) Week-end occupé, fête des pères.
using SDL_TexturePtr = unique_ptr<SDL_Texture, SDL2PtrDeleter>;
La troisième option n'est pas option :: STD :: Default_Delete n'est pas appliquée sur STD :: Shared_PTR, sauf si elle est transmise explicitement comme Delier au constructeur.
@ Dieterlücking: il suffit de la lire, et merci, vous avez malheureusement raison. Maintenant fixé.
Vous êtes trop raccroché sur la mise en place du Delier dans le type lui-même. Concentrez-vous plutôt sur où La solution la plus efficace à ce problème consiste à centraliser correctement où Évidemment, un tel système n'offre aucune garantie. Cependant, si vous n'utilisez tout simplement jamais En fin de compte, ce n'est pas différent d'une base de code qui fait une utilisation libérale de partagé_ptr code> les instances em> viennent de. P>
partagé_ptr code> s pour ce système est introduit. Il devrait y avoir une seule fonction qui les génère; Il est responsable de la fixation du Delier approprié. P>
partagé_ptr :: réinitialiser code> (et vraiment, il y a peu de raisons de le faire) et vous ne construisez jamais directement une (copier / déplacement va bien, mais les autres constructeurs ne sont pas), Ensuite, vous êtes en sécurité. Si vous devez réaffecter un
partagé_ptr code> à une nouvelle instance, utilisez simplement
opérateur = code>; C'est ce que c'est pour. p>
make_shared code>. p>
Vous devriez pouvoir utiliser un Veneer : qui peut être généralisé avec: p> Vous devez être capable de hériter des constructeurs: p> Il ne semble pas avoir été conçu pour être sous-classé,
puisqu'il a un destructeur non virtuel p>
blockQquote> le papier référencé implique qu'il est sûr pour ce cas d'utilisation. Il serait intéressant d'avoir des références appropriées de la norme, cependant. P> p>
Merci pour le lien. C'est bien, mais si je n'ai rien oublié, cela ne semble pas aborder la pièce concernant réinitialiser () code>.
Pourquoi ne pas envelopper la classe elle-même pour la rendre Raii conforme et ajuster
Shared_ptr code> Shard_ptr (s)?
Je ne vois pas encore pourquoi vous avez vraiment besoin d'un Delier personnalisé. Ne mettrait pas
sdl_destroytexture (PTR); code> au travaux destructeurs ainsi que le Delier par défaut?
@lorro: cela ne fonctionne que pour les textures. L'objectif est de travailler pour n'importe quel type T.
Une meilleure question est la suivante: pourquoi avez-vous tant d'endroits dans votre code où vous construisez ou réinitialisez des textures SDL? Cela devrait vraiment être localisé à un peu d'emplacements.
@lorro: Vous supposez que
sdl_texture code> est un type C ++ avec un destructeur. Le point d'avoir supprimé du tout est de gérer des types qui ont aucun destructeurs i>, tels que des types créés par des bibliothèques basées sur C.
La troisième option n'est pas option :: STD :: Default_Delete n'est pas appliquée sur STD :: Shared_PTR, sauf si elle est transmise explicitement comme Delier au constructeur.
@ Dieterlücking Oui, tu as raison, mon erreur. Je vais éditer la question.