Quelle est la signification d'une Classe C++ Wrapper?

j'ai un peu de mal à comprendre un cours d'emballage. Ce serait bien si quelqu'un pouvait aider à fournir des exemples appropriés.

  1. Qu'est-ce qu'une classe D'Emballage C++ et quelles sont les circonstances pour l'écrire ?
  2. Quelle est son utilisation ?

Merci.

36
demandé sur Mahesh 2011-03-15 06:21:30

5 réponses

Une "classe wrapper" est de facto un terme qui signifie une classe qui "s'enroule autour de" une ressource; je.e, qui gère la ressource. Quand les gens écrivent un papier d'emballage, alors, ils font quelque chose comme ceci:

class int_ptr_wrapper
{
public:
    int_ptr_wrapper(int value = 0) :
    mInt(new int(value))
    {}

    // note! needs copy-constructor and copy-assignment operator!

    ~int_ptr_wrapper()
    {
        delete mInt;
    }

private:
    int* mInt;
};

cette classe gère ("wraps") un pointeur vers un int . Toutes les ressources doivent être emballées d'une manière ou d'une autre, pour la propreté (pas de code de nettoyage explicite ou de bruit) et l'exactitude (destructeur est garanti de fonctionner; ne peut pas oublier de nettoyer, et en sécurité avec exception.)

Ce modèle est appelé gestion des ressources en fonction de la portée (GPRD), bien qu'un nom beaucoup plus courant (mais le plus ésotérique) soit L'acquisition de ressources par initialisation (IAR). L'idée est de lier une ressource propre à un destructeur, pour les raisons indiquées ci-dessus: le champ d'application se charge du reste.

Notez que j'ai dit qu'il manquait un constructeur par copie et copie-opérateur d'affectation. Cela est dû à la règle de trois . (Voir question liée pour explication détaillée.) La façon la plus simple de mettre en œuvre correctement cette règle est avec l'idiome de copie-et-échange, expliqué ici .


parfois, il n'est pas pragmatique d'écrire une classe d'emballage pour le nettoyage des ressources, habituellement lorsque la ressource est unique ou utilisée une fois. (Ou avec programmation transactionnelle.) La solution à cela s'appelle scope guard , une façon d'écrire le code de nettoyage à l'intérieur la fonction qui a besoin d'elle.

vous pouvez trouver de plus amples informations en effectuant une recherche dans votre fournisseur de recherche préféré (C'est-à-dire Google), ou en allant sur le" document "principal ici . Notez que Boost fournit un utilitaire pour cela, comme il le fait habituellement pour les bons idiomes.

29
répondu GManNickG 2017-05-23 12:10:27

un wrapper est juste une petite classe dont le but est de fournir une interface différente que la chose qu'il enveloppe. Par exemple, il est courant de prendre une API C et écrire une ou plusieurs classes qui "wrap" pour fournir une interface orientée objet plutôt que d'une procédure.

10
répondu John Zwinck 2011-03-15 03:26:50

vous avez demandé les circonstances de l'écriture des classes d'emballage.Par exemple, si vous êtes dans une entreprise qui fait usage de différents types de caméras, disons USB, firewire etc. Chacun des fabricants fourniront un ensemble de fonctions différent au travers d'une API pour démarrer l'appareil photo, réglez les paramètres et lire le flux d'image.

Maintenant, le programmeur qui développe des applications de votre entreprise doivent être isolés de tous les détails spécifiques dans les différents API. Maintenant, ce que vous pouvez faire est d'écrire une classe wrapper autour de L'API pour chacune des caméras ou plus intelligemment, juste une classe avec des fonctions simples, enveloppant autour du code existant fourni par L'API.

Par exemple, nous pouvons concevoir des classes MyUSBCameraWrapperClass, MyFirewireCameraWrapperClass avec certaines fonctions de membre comme setFrameRate(int fps), gétimgframe (*framebuffer), etc.

les programmeurs de votre entreprise peuvent alors utiliser MyUSBCameraWrapperClass usbcam; usbcam.setFrameRate (30), etc. Vous obtenez le point??

7
répondu hAcKnRoCk 2011-08-10 16:17:15

une classe wrapper est une classe qui enveloppe une fonctionnalité avec une autre interface.

supposons que vous ayez la fonction f() :

void f() { std::cout << "hello\n"; }

une classe d'emballage simple pourrait être

class C {
    f() { std::cout << "hello\n"; }
};

vous pouvez écrire un wrapper quand votre base de code existante attend une interface particulière. C'est l'essence de la conception de l'adaptateur. Ou vous pouvez l'envelopper d'une fonction dans une classe si vous souhaitez maintenir l'état pour que fonction. Ou vous pourriez envelopper une fonction dans un constructeur ou un destructeur de classe si vous voulez qu'elle soit commodément et automatiquement appelée pour vous d'une manière correcte et déterministe. Et la liste continue.

3
répondu wilhelmtell 2011-03-15 03:30:03

j'utilise deux sortes:

  1. ressources des wrappers pour fonction paires fournies par le système d'exploitation comme

    • UNIXs: open / close, mmap / munmap, dlopen /dlclose
    • Windows: CreateFile/ DestroyHandle, CreateFileMapping/CloseHandle, LoadLibrary /FreeLibrary
  2. emballages fonctionnels pour les fonctions fournies par L'OS comme

    • UNIXs: écrire, lire, dlsym
    • Windows: ReadFile, WriteFile ,Geprocaddress

l'enrubanneur de ressources fait certain, que le code généré par le compilateur s'inquiète de la destruction de la ressource créée par le constructeur via ce qui est aujourd'hui appelé RAII. Il est facile de combiner de telles classes via des relations base/Classe de membre en classes complexes. En cas d'échec de la fonction de création, un l'exception d'erreur de système est lancée, fournissant des informations d'erreur riches sur l'erreur.

l'enveloppe fonctionnelle est utilisée à la place de la fonction os simple. Aussi en cas de panne une exception de système est lancée.

ainsi, quelqu'un qui utilise mon code n'a pas besoin d'un débogueur et d'un code de débogage pour découvrir ce qui ne fonctionne pas dans un environnement complexe avec de nombreuses bibliothèques et de nombreux processus et machines distantes.

aussi ces enveloppements fournissent certaines abstraction de système d'exploitation -- le code qui les utilise n'a pas à se soucier des différences de système d'exploitation.

2
répondu 2014-02-06 23:03:04