experiencia
Servicios - Sepa lo que Ricardo Devis & Asociados pueden hacer por ustedPublicaciones - Consulte los documentos que ponemos a su disposiciónContacto - Conozca como ponerse en contacto con Ricardo Devis & Asociados
 


RPP diciembre 1998

C++ STL: La Biblioteca Estándar de Plantillas en C++


Ricardo Devis
Botella

¿Quién no ha usado en C++ macros genéricas, o aun cierto tipo de derivación o las relativamente nuevas plantillas, para reutilizar código ligado a ciertos tipos de datos, determinados iteradores o útiles algoritmos? ¿Debemos recurrir a bibliotecas comerciales para encontrar clases contenedoras básicas (vector, bolsa, etc.) o, peor aún, codificar a-mano las estructuras de datos necesitadas, cuando el lenguaje debiera, en un alarde de prudencia, procurarlas? La STL es una adición al estándar del lenguaje C++ que soluciona todas estas cuitas.

 


Una nueva revisión exige un nuevo enfoque. Y puesto que Visual C++ es suficientemente conocido, he optado por la guía visual y declarativa. No criticaré, pues, a Java ni a Visual Basic, ni a Microsoft ni a Sun. Abundarán, en contrapartida, esquemas y gráficos, que pretenderán insuflar al lector la idea de C++ como ensamblador universal y lenguaje auténticamente dúctil. No abordaré, por fin, comparaciones entre Microsoft Visual C++, Borland C++ Builder, VisualAge for C++, etc., toda vez que tales revisiones requieren de muchas más páginas, tiempo y objetivos de los que uno cuenta en estos cortos artículos.

EL USUARIO PROPONE Y MICROSOFT DISPONE

Se han añadido al producto las características que, según Microsoft, los programadores deseaban:

  • Integración de configuraciones cliente/servidor con tecnología Internet, incluyendo el uso de normalizaciones abiertas y soporte de modelos de componentes.
  • Acceso avanzado a datos, que incluiría escalabilidad, seguridad, transacciones y hebras de ejecución.
  • Mayor soporte técnico y menos tiempo de aprendizaje.
  • Compatibilidad con las bibliotecas ya existentes, con las aplicaciones basadas en viejas versiones de la MFC, con los proyectos anteriores y, al fin, con tecnologías en las que se realizó una inversión que hoy no quiere perderse.

A tal fin, el objetivo prioritario del equipo de desarrollo de Visual C++ ha sido que su herramienta facilite y acelere la programación de aplicaciones y componentes altamente eficaces. El resultado es que el código que Visual C++ 5.0 genera es más pequeño y rápido, la productividad mejora a causa de las facilidades para el trabajo con ActiveX y COM en proyectos, y la escalabilidad se obtiene con soporte para el trabajo en grupo (mediante Visual SourceSafe 5.0 y el uso de SCCI) y un adecuado acceso a datos (optimizado con Microsoft Transaction Server 1.0, developer edition).

MEJORAS EN EFICACIA

El generador de código se ha cambiado casi por completo, siendo así que la velocidad del código ha aumentado (y su tamaño disminuido) en más de un 10% (respecto de una compilación equivalente con la versión 4.2). Además se ha añadido soporte específico para Intel MMX y Pentium Pro. Se han optimizado el proceso de enlazado (linking) y el de inlining, a la vez que ahora el producto cuenta con la biblioteca C++ normalizada de Plauger, con unas nuevas MFC (Microsoft Foundation Classes) multienhebradas y con la ayuda de la ATL (Active Template Library) 2.0, para la construcción de controles ActiveX optimizados en tamaño. De hecho la unión de MFC y ATL se denomina MFC&T, con la idea de dotar de un sólo nombre a la unión de la solidez y productividad de las MFC con la eficacia de las plantillas. Naturalmente el lector ya habrá adivinado que esto es sólo estiércol comercial, pues fácilmente las MFC podrían haberse basado directamente en plantillas sin cambiar el nombre. Y no es éste un nuevo asunto de Visual C++ 5.0.

BIBLIOTECAS, PLANTILLAS Y COM

Del éxito de las MFC no voy a quejarme ahora (aunque he de confesar que su diseño me causa frecuentes pesadillas y escalofríos neuronales). Tampoco puedo renegar del soporte industrial que otros fabricantes de compiladores C++ le han dado: Symantec, Borland, MetaWare, Watcom, etc. Ni siquiera podría decir que las 120.000 líneas de código en las que se basa la biblioteca son especialmente ineficientes. Pero el diseño, el diseño... En fin, dicen que a todo llega a acostumbrarse uno. Volviendo a las MFC, hay que decir que Visual C++ 5.0 proporciona asistentes para la construcción de aplicaciones basadas en tal biblioteca:

 

 

 

 

 

Figura 1: MFC AppWizard

  Claro que, con todo, faltaban las plantillas, que ahora llegan de la mano de la ATL. ¿Y qué es la ATL? Un conjunto de clases C++, sustentadas en plantillas (templates), con las que pueden fácilmente crearse objetos COM pequeños y eficientes (pues tales son, en el ámbito del lenguaje C++, los objetivos también de las plantillas). ATL nos proporciona plantillas de implementaciones de IUnknown, IClassFactory, IClassFactory2 e Idispatch, interfaces duales, interfaces de enumeración COM normalizados, puntos de conexión, interfaces desgajables y, por supuesto, controles ActiveX. Naturalmente el pertinente asistente nos será de gran ayuda:  


Figura 2: ATL COM AppWizard

 


ENTORNO MEJORADO E INTEGRACIÓN A ULTRANZA

Se ha procurado la integración del IDE de Visual Studio respecto de Visual C++, Visual J++, Visual InterDev, Visual SourceSafe y MSDN, a la vez que se ha mejorado el sistema de compilación (build) de proyectos y añadido barras de comandos. La siempre deseable personalización del entorno viene, por otro lado, de la mano de Visual Basic Scripting Edition y de la posibilidad de construir servidores de automatización en cualquier lenguaje.

 


Figura 3: Integración de Visual C++ en Visual Studio

 


SOPORTE COM

El nuevo entorno ha añadido soporte COM directamente embebido en el lenguaje, de forma que a la facilidad y eficacia con que mediante la ATL 2.0 se construyen objetos COM, se adicionan capacidades de edición visual COM y, sobre todo, la gran simplificación consecuente del código, como puede apreciarse en el siguiente ejemplo:

CÓDIGO NECESARIO ANTES DE VISUAL C++ 5.0

CON EL NUEVO SOPORTE COM EMBEBIDO EN VISUAL C++ 5.0

#include <stdio.h>
#include <assert.h>
#include "ldemo2.h"
#include <initguid.h>
#include "ldemo2_i.c"

struct Com_Init {
     Com_Init() { CoInitialize(NULL); }
     ~Com_Init() { CoUninitialize(); }
} _com_init_inst;

void main()
{
   ILDemo* p;
   HRESULT hr =
       CoCreateInstance(CLSID_LDemo, NULL,
       CLSCTX_INPROC_SERVER, IID_ILDemo,
       reinterpret_cast<void**>(&p));
   assert(SUCCEEDED(hr));
   BSTR b = SysAllocString(L"foo");
   VARIANT v;
   VariantInit(&v);
   V_VT(&v) = VT_BSTR;
   V_BSTR(&v) = b;
   hr = p->put_var(v);
   assert(SUCCEEDED(hr));
   VariantClear(&v);
   BSTR b2;
   VARIANT v2;
   VariantInit(&v2);
   hr = p->get_var(&v2);
   assert(SUCCEEDED(hr));
   b2 = V_BSTR(&v2);
   printf("p->var=%S\n", b2);
   VariantClear(&v2);
   p->Release();
}

#import "ldemo2.tlb" no_namespace
ILDemoPtr p(__uuidof(LDemo));
p->var = "foo";

 

ASISTENTES

Visual C++ 5.0 provee, además de los vistos, muchos y variados asistentes (wizards), clasificables en tres tipos:

  • Orientados-a-Objetos: AppWizard, AppStudio, ClassWizard
  • Internet: ISAPI, ATL COM, ActiveX Control
 

Figura 4: MFC ActiveX ControlWizard

    • Wizards: para construir asistentes personalizados

Figura 5 : Custom AppWizard

 

ESTÁNDARES

Visual C++ 5.0 contiene las últimas adiciones al borrador del estándar ANSI/ISO del lenguaje, incluyendo namespaces, plantillas, conversiones, excepciones y RTTI, además de las nuevas (no tan nuevas) palabras reservadas bool, explicit, mutable y typename. Hay que decir que hay otras características que no se han contemplado. Claro que se trata de un borrador.

INTERNET

La biblioteca de clases MFC encapsula WinInet (ActiveX, http, ftp, gopher, ISAPI, etc.), además de soportar URLs asíncronas. Pero además el IDE de Visual C++ 5.0 es sensitivo a HTML respecto de su edición y ayuda contextual. De esta forma el tan deseado código HTML puede ser ahora embebido, sin más, en el código C++.

#include <windows.h>

#include <wininet.h>

void main (int argc, char ** argv) {

hInternet = InternetOpen (“Mi MicroBrowser”, ...);

while (lpszUrl = DisplayPage(…)) {

hUrl = InternetOpenUrl (hInternet, lpszUrl, …);

do {

ok = InternetReadFile (hUrl, …);

} while (ok && (bytesRead != 0));

InternetCloseHandle (hUrl);

}

InternetCloseHandle (hInternet);

} /* main */

El Asistente ISAPI permite, al fin, crear filtros y extensiones de servidores Web.

BASES DE DATOS

La edición corporativa (Enterprise Edition) de Visual C++ conlleva soporte SQL sustanciado en depuración SQL remota, edición SQL y... ¡en la inclusión del producto Microsoft SQL Server 6.5! Bueno, no sé si esto será soporte, pero queda muy bien dicho así. Por otro lado la herramienta aporta enlace con datos mediante DAO, RDO y Apex. Además las MFC constan de clasese ODBC de enhebramiento seguro, mientras que la ATL soporta Internet Information Server y objectos MTS.

 


Figura 6: Soporte de Bases de Datos

 
 
volver a la página de publicaciones
 
 
 Pº. Castellana 188, 14º e · 28046 - Madrid · info@a4devis.com