van tipos seco refrigerados plataforma pies mide metros medidas cuanto contenedores contenedor container c++ class wrapper

tipos - ¿Cuál es el significado de una clase de contenedor C++?



tipos de contenedores pdf (5)

Un contenedor es solo una clase pequeña cuyo propósito es proporcionar una interfaz diferente a la que envuelve. Por ejemplo, es común tomar una API de C y escribir una o más clases que la "envuelven" para proporcionar una interfaz orientada a objetos en lugar de una de procedimiento.

Tengo un pequeño problema para entender una clase contenedora. Sería genial si alguien pudiera ayudar a proporcionar ejemplos adecuados.

  1. ¿Qué es una clase de Contenedor C ++ y cuáles son las circunstancias para escribirlo?
  2. ¿De qué se trata de alguna manera?

Gracias.


Una clase contenedora es una clase que envuelve una funcionalidad con otra interfaz.

Supongamos que tiene la función f() :

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

Una clase de contenedor simple podría ser

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

Puede escribir un contenedor cuando su base de código existente espera una interfaz en particular. Esta es la esencia del patrón de diseño del adaptador. O puede envolver una función en una clase si desea mantener el estado para esa función. O puede envolver una función en el constructor o destructor de una clase si desea que se le llame de forma conveniente y automática de una manera correcta y determinista. Y la lista continúa.


Usted solicitó circunstancias para escribir clases de contenedor. Por ejemplo, si se encuentra en una compañía que utiliza diferentes tipos de cámaras, digamos USB, firewire, etc. Cada uno de los fabricantes proporcionará un conjunto diferente de funciones a través de una API para inicie la cámara, configure los parámetros y lea la secuencia de la imagen desde allí.

Ahora el programador que crea las aplicaciones en su empresa necesita estar aislado de todos los detalles específicos en las diversas API. Ahora, lo que puede hacer es escribir una clase contenedora alrededor de las API para cada una de las cámaras o más inteligente, solo una clase con funciones simples, que se ajuste al código existente provisto por la API.

Por ejemplo, podemos diseñar clases MyUSBCameraWrapperClass, MyFirewireCameraWrapperClass con algunas funciones miembro como setFrameRate (int fps), getImgFrame (* framebuffer), etc.

Los programadores de su empresa pueden utilizar la usbcam MyUSBCameraWrapperClass; usbcam.setFrameRate (30), etc. ¿Entiendes el punto?


Yo uso dos tipos:

  1. envoltorios de recursos para pares de funciones proporcionados por el sistema operativo como

    • UNIXs: abrir / cerrar, mmap / munmap, dlopen / dlclose
    • Windows: CreateFile / DestroyHandle, CreateFileMapping / CloseHandle, LoadLibrary / FreeLibrary
  2. envoltorios funcionales para funciones proporcionadas por el sistema operativo como

    • UNIXs: escribir, leer, dlsym
    • Windows: ReadFile, WriteFile, GetProcAddress

El contenedor de recursos asegura que el código generado por el compilador se preocupa por la destrucción del recurso creado por el constructor a través de lo que hoy se llama RAII. Es fácil combinar dichas clases a través de relaciones de clase base / miembro en clases complejas. En caso de que la función de creación falle, se lanza una excepción de error del sistema, proporcionando abundante información de error sobre el error.

El contenedor funcional se usa en lugar de la función simple del sistema operativo. También en caso de falla, se lanza una excepción del sistema.

De esta forma, alguien que utiliza mi código no necesita un depurador y un código de depuración para averiguar qué está fallando en un entorno complejo con muchas bibliotecas y procesos y máquinas remotas.

Además, estos envoltorios proporcionan algo de abstracción del sistema operativo: el código que los utiliza no tiene que preocuparse por las diferencias del sistema operativo.


Una "clase contenedora" es un término de facto que significa una clase que "envuelve" un recurso; es decir, que maneja el recurso. Cuando las personas escriben un contenedor, entonces, están haciendo algo como esto:

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; };

Esta clase maneja ("envuelve") un puntero a un int . Todos los recursos deben ser envueltos de alguna manera, por limpieza (sin código de limpieza explícito o ruido) y corrección (se garantiza que destructor se ejecutará, no se puede olvidar de limpiar y seguro con excepciones).

Este patrón se denomina Administración de recursos con límite de alcance (SBRM), aunque un nombre mucho más común (pero más esotérico) es Recurso-Adquisición es Inicialización (RAII). La idea es vincular la limpieza de un recurso a un destructor, por las razones indicadas anteriormente: el alcance maneja el resto.

Tenga en cuenta que dije que faltaba un constructor de copias y un operador de asignación de copias. Esto se debe a la Regla de los Tres . (Consulte la pregunta vinculada para obtener una explicación detallada.) La forma más sencilla de implementar correctamente esta regla es con la expresión copiar y cambiar, que se explica aquí .

A veces, no es pragmático escribir una clase contenedora para la limpieza de recursos, generalmente cuando el recurso es único o se usa una vez. (O con la programación transaccional.) La solución a esto se llama scope guard , una forma de escribir código de limpieza dentro de la función que lo necesita.

Puede encontrar más información buscándola en su proveedor de búsqueda favorito (es decir, Google) o yendo al documento "principal" aquí . Tenga en cuenta que Boost ofrece una utilidad para esto, como generalmente lo hace para buenas expresiones idiomáticas.