Escolar Documentos
Profissional Documentos
Cultura Documentos
Programación III
¿Qué son?
En C++, los punteros inteligentes pueden ser implementados como una "template class" que
imita, mediante sobrecarga de operadores, el comportamiento de los punteros tradicionales, pero
proporcionando algoritmos de administración de memoria.
Los punteros inteligentes se definen en el espacio de nombres std del archivo de encabezado
<memory>. Son cruciales en la expresión de programación RAII o Resource Acquisition Is
Initialialization. El objetivo principal de esta expresión es asegurarse de que la adquisición de recursos
ocurre al mismo tiempo que se inicializa el objeto, de manera que todos los recursos del objeto se
creen y se dispongan en una sola línea de código. En la práctica, el principio básico RAII consiste en
proporcionar la propiedad de cualquier recurso asignado por montón (por ejemplo, memoria asignada
dinámicamente o identificadores de objetos del sistema) a un objeto asignado a la pila cuyo destructor
contiene código para eliminar o liberar el recurso, además de cualquier código asociado de limpieza.
En el siguiente código se compara una declaración de puntero sin formato con una
declaración de puntero inteligente:
Como se muestra en el ejemplo, un puntero inteligente es una plantilla de clase que se declara
en la pila y se inicializa con un puntero sin formato que apunta a un objeto asignado por montón. Una
vez que se inicializa el puntero inteligente, se convierte en propietario del puntero sin formato. Esto
significa que el puntero inteligente es responsable de eliminar la memoria que el puntero sin formato
especifica. El destructor del puntero inteligente contiene la llamada de eliminación y, dado que el
puntero inteligente se declara en la pila, su destructor se invoca cuando el puntero inteligente sale del
ámbito, incluso si se produce una excepción en alguna parte que se encuentre más arriba en la pila.
Para acceder al puntero encapsulado, utilice los conocidos operadores de puntero -> y *, que
la clase del puntero inteligente sobrecarga para devolver el puntero sin formato encapsulado.
Los punteros inteligentes están diseñados para ser lo más eficaces posible tanto en términos de
memoria como de rendimiento. Por ejemplo, el único miembro de datos de unique_ptr es el puntero
encapsulado. Esto significa que unique_ptr tiene exactamente el mismo tamaño que ese puntero,
cuatro u ocho bytes. El acceso al puntero encapsulado a través del puntero inteligente sobrecargado
* y los operadores -> no es mucho más lento que el acceso directo a los punteros sin formato.
Los punteros inteligentes tienen sus propias funciones miembro, a las que se accede mediante la
notación “punto”. Por ejemplo, algunos punteros inteligentes de STL tienen una función miembro de
restablecimiento que libera la propiedad del puntero. Esto es útil cuando se quiere liberar la memoria
que es propiedad del puntero inteligente antes de que el puntero inteligente salga del ámbito, tal y
como se muestra en el ejemplo siguiente.
Los punteros inteligentes suelen proporcionar un mecanismo para acceder directamente al
puntero sin formato. Los punteros inteligentes STL tienen una función miembro de get con este
propósito y CComPtr tiene un miembro de clase p público. Si proporciona acceso directo al puntero
subyacente, puede utilizar el puntero inteligente para administrar la memoria en el propio código y
continuar pasando el puntero sin formato en un código que no admita punteros inteligentes.
unique_ptr
Permite exactamente un único propietario del puntero subyacente. Utilice esta opción como
predeterminada para los objetos POCO, a menos que sepa con certeza que necesita un objeto
shared_ptr. Puede moverse a un nuevo propietario, pero no se puede copiar ni compartir.
Sustituye a auto_ptr, que está desusado. Comparado con boost::scoped_ptr, unique_ptr es
pequeño y eficaz; el tamaño es un puntero y admite referencias rvalue de inserción y
extracción rápidas en colecciones STL. Archivo de encabezado: <memory>.
shared_ptr
Puntero inteligente con recuento de referencias. Utilícelo cuando desee asignar un puntero
sin formato a varios propietarios, por ejemplo, cuando devuelve una copia de un puntero
desde un contenedor pero desea conservar el original. El puntero sin formato no se elimina
hasta que todos los propietarios de shared_ptr han salido del ámbito o, de lo contrario, han
renunciado a la propiedad. El tamaño es dos punteros: uno para el objeto y otro para el bloque
de control compartido que contiene el recuento de referencias. Archivo de encabezado:
<memory>.
weak_ptr
Puntero inteligente de caso especial para usarlo junto con shared_ptr. weak_ptr proporciona
acceso a un objeto que pertenece a una o varias instancias de shared_ptr, pero no participa en
el recuento de referencias. Utilícelo cuando desee observar un objeto, pero no quiere que
permanezca activo. Es necesario en algunos casos para interrumpir las referencias circulares
entre instancias de shared_ptr. Archivo de encabezado: <memory>.
CComPtr Class
Utilice esta opción a menos que no puede usar ATL. Realiza el recuento de referencias
mediante los métodos AddRef y de Release..
CComQIPtr Class
Se parece a CComPtr, pero también proporciona la sintaxis simplificada para llamar a
QueryInterface en objetos COM.
CComHeapPtr Class
Puntero inteligente a objetos que utilizan CoTaskMemFree para liberar memoria.
CComGITPtr Class
Puntero inteligente para las interfaces que se obtienen de la tabla de interfaz global (GIT).
_com_ptr_t (Clase)
Se parece a CComQIPtr en funcionalidad, pero no depende de los encabezados ATL.
CAutoPtr Class
Puntero inteligente que exige una propiedad única al transferir la propiedad en la copia. Puede
compararse con la clase std::auto_ptr desusada.
CHeapPtr Class
Puntero inteligente para objetos asignados mediante la función malloc de C.
CAutoVectorPtr Class
Puntero inteligente para matrices que se asignan mediante new[].
CAutoPtrArray Class
Clase que encapsula una matriz de elementos CAutoPtr.
CAutoPtrList Class
Clase que encapsula los métodos para manipular una lista de nodos de CAutoPtr.
QT en C++
¿Qué es?
Ventajas
Rápido
En desarrollo de software, tiempo es dinero. Ese es el motivo por el que Qt te da un
completo espacio de trabajo productivo con bibliotecas multiplataforma, APIs y
herramientas para llegar al mercado lo antes posible
Fácil
Soluciones sencillas – Qt es fácil de usar y un flexible entorno de desarrollo y
herramientas de diseño que incluyen controles ya hechos y funcionalidad prediseñada
para un diseño de usuario eficiente
Es gratuito: Todas las herramientas de Qt son gratuitas para bajar y usar y está
permitido usarlas para crear proyectos comerciales. Y, obviamente, si decidimos que
Qt no nos sirve no importa porque no nos costó nada.
Gran comunidad online: Ante cualquier problema o duda siempre habrá una
comunidad amable, bien informada y dispuesta a ayudar.
Uso de QML para escribir código más rápido: Si recién empezamos o queremos
crear algo rápidamente, probablemente nos convenga utilizar Qt Quick (Qt User
Interface Creation Kit). Con el mismo, utilizamos el constructor de interfaz visual y
el código JavaScript QML para crear la aplicación. También se puede combinar C++
y QML en una misma aplicación.
Ejemplos
Descripción
linea 5
Aquí se agrega la referencia a la librería QWidget
linea 11
Se crea el objeto QWidget que se llamará ventana.
linea 12
Se ajusta el tamaño del objeto ventana.
linea 14
En esta linea se observa la referencia que se hace al crear el objeto boton_salir. En
vez de crearse una estancia en aplicacion se crea en la estancia ventana.
linea 17
Se agrega una nueva propiedad al boton_salir; setGeometry ajusta los valores de la
posición gráfica (20,50,150,40) en que se deberá encontrar el boton_salir. Esta
posición es relativa de acuerdo al contenedor, en este caso es relativa a ventana.
linea 10
Finalmente mostramos la aplicación(ventana.show()) en los ejemplos anteriores se
observa que para mostrar la aplicación el código era aplicacion.show() sin embargo
en este caso nuestra estancia que contiene los widgets (el boton_salir) es ventana por
lo consiguiente es el que queremos mostrar.
Compilar
Compilar con qmake -project, qmake y make.
FMOD
Para reproducir el * .mp3 y reproducirlo cada vez que termina como un bucle:
mciSendString("play mp3 repeat", NULL, 0, NULL);
To pause the *.mp3 in middle:
mciSendString("pause mp3", NULL, 0, NULL);
To stop it in middle:
mciSendString("stop mp3", NULL, 0, NULL);
Ejemplo
MMSystem.h
PlaySound
Sintaxis
Parámetros
pszSound
Una cadena que especifica el sonido para jugar. La longitud máxima, incluido el
terminador nulo, es de 256 caracteres. Si este parámetro es NULL , cualquier sonido
de forma de onda que se esté reproduciendo se detendrá. Para detener un sonido que
no sea de onda, especifique SND_PURGE en el parámetro fdwSound .
hmod
Diríjase al archivo ejecutable que contiene el recurso que se va a cargar. Este
parámetro debe ser NULL a menos SND_RESOURCE se especifica en fdwSound .
fdwSound
Banderas para tocar el sonido.
Observaciones
Ejemplos
Referencias
(04 de abril de 2018). Obtenido de
https://es.wikibooks.org/wiki/Introducci%C3%B3n_a_Patrones_de_Dise%C3%B1o
_en_C%2B%2B_con_Qt4
Alexandrescu, A. (2002). Modern C++ Design: Generic Programming and Design
Patterns Applied. Addison-Wesley.
Josuttis, N. M. (1999). The C++ Standard Library - A Tutorial and Reference.
Microsoft. (05 de abril de 2018). Obtenido de https://msdn.microsoft.com/es-
es/library/hh279674.aspx
Microsoft. (06 de abril de 2018). Obtenido de Función PlaySound:
https://msdn.microsoft.com/en-
us/library/windows/desktop/dd743680%28v=vs.85%29.aspx
Qt. (07 de abril de 2018). Obtenido de The Qt Company: https://www1.qt.io/es/
r4miro. (08 de abril de 2018). Obtenido de Hipertextual:
https://hipertextual.com/archivo/2011/03/13-razones-para-utilizar-qt/
Sutter, H. (06 de abril de 2018). The New C++: Smart(er) Pointers. Obtenido de Wayback
Machine:
https://web.archive.org/web/20060220195924/http://www.cuj.com/documents/s=79
80/cujcexp2008sutter/
Taringa. (05 de abril de 2018). Obtenido de Como poner sonidos en C++(Muy Fácil):
https://www.taringa.net/posts/hazlo-tu-mismo/18417230/Como-poner-sonidos-en-
C-Muy-Facil.html
WikiBooks. (05 de abril de 2018). Obtenido de Programación con Qt4/Crear una ventana:
https://es.wikibooks.org/wiki/Programaci%C3%B3n_con_Qt4/Crear_una_ventana