Maison > développement back-end > C++ > Comment puis-je utiliser `std::unique_ptr` avec des types incomplets en C ?

Comment puis-je utiliser `std::unique_ptr` avec des types incomplets en C ?

Mary-Kate Olsen
Libérer: 2024-12-07 10:48:13
original
722 Les gens l'ont consulté

How Can I Use `std::unique_ptr` with Incomplete Types in C  ?

Utiliser std::unique_ptr avec des types incomplets

Dans l'idiome pimpl, utiliser std::unique_ptr avec un type incomplet peut conduire à une compilation erreurs. Considérez le code suivant :

class window {
  window(const rectangle& rect);

private:
  class window_impl; // defined elsewhere
  std::unique_ptr<window_impl> impl_; // won't compile
};
Copier après la connexion

L'erreur survient généralement lorsque vous tentez d'utiliser sizeof sur un type incomplet, comme indiqué dans ligne 304.

Le problème

Le problème vient du fait que le compilateur a besoin de connaître la taille du type incomplet pour déterminer l'allocation pour le std :: unique_ptr. Cette information n'est pas disponible, ce qui entraîne une erreur de compilation.

La solution

Pour résoudre ce problème, il est essentiel d'implémenter un destructeur pour la classe contenant le unique_ptr. En effet, le destructeur par défaut généré par le compilateur nécessite une déclaration complète du type. Voici un exemple :

class foo {
    class impl;
    std::unique_ptr<impl> impl_;

public:
    foo(); // You may need a def. constructor to be defined elsewhere

    ~foo(); // Implement (with {}, or with = default;) where impl is complete
};
Copier après la connexion

En implémentant le destructeur, le compilateur acquiert les connaissances nécessaires pour gérer la destruction de l'unique_ptr.

Cas particuliers

Dans certains scénarios, l'utilisation de unique_ptr avec des types incomplets peut ne pas être possible :

  • Constructeurs de modèles : Si la classe a des constructeurs de modèles, le compilateur a besoin du type complet pour déterminer les exceptions potentielles dans la construction et comment gérer la destruction.
  • Objets de durée statique : L'utilisation de unique_ptr dans la portée de l'espace de noms peut également échouer, car le compilateur doit savoir comment détruire l'objet de durée statique. Dans de tels cas, une solution de contournement consiste à définir une classe d'assistance avec un destructeur :
class impl;
struct ptr_impl : std::unique_ptr<impl> {
    ~ptr_impl(); // Implement (empty body) elsewhere
} impl_;
Copier après la connexion

En suivant ces directives, vous pouvez utiliser efficacement unique_ptr avec des types incomplets, garantissant ainsi un processus de compilation fluide.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal