| Artículos | 01 MAR 2001

Visual C++ C++ Builder

Tags: Histórico
Francisco Charte.
Estos dos entornos son los más utilizados en Windows para desarrollar aplicaciones utilizando el lenguaje C++ y, aunque lógicamente son distintos, los dos están basados en el mismo lenguaje, por lo que comparten características. Algunos de los trucos descritos a continuación son aplicables, asimismo, a cualquier otro compilador de C++.

81- Destructores virtuales
C++ es un lenguaje orientado a objetos en el que es posible definir nuevas clases a partir de otras ya existentes, usando para ello un mecanismo de herencia. Esta técnica, conjuntamente con el polimorfismo, permite reutilizar código de una manera bastante eficiente. En la herencia y el polimorfismo juegan un papel importante los métodos virtuales, pero la mayoría de los programadores pasan por alto el hecho de que los destructores también deben ser virtuales.
En lugar de explicar con palabras el motivo de esa necesidad, veámoslo mejor con un ejemplo bastante claro. Partamos de la definición de las dos clases siguientes:
class Base {
protected:
int N;
public:
Base() : N(6) {}
~Base()
{ ShowMessage(N); }
};

class Derivada : public Base {
public:
Derivada() {}
~Derivada() { N /= 2; }
};

Con el fin de simplificar, toda la implementación se encuentra en línea dentro de la misma definición de clases. La clase Base cuenta con un miembro protegido, accesible por tanto para
Derivada, al que asigna un valor inicial. Cuando el objeto es destruido se muestra el valor que tiene en ese momento. Puesto que en la clase
Base no se manipula la variable, siempre que se destruya un objeto de este tipo el valor será el mismo dado inicialmente.
En la clase Derivada, que tiene como base a la anterior, se modifica el valor de N en el destructor, dividiéndolo entre dos. Si creamos un objeto de esta clase y a continuación lo destruimos, el valor de N mostrado en el destructor de Base será 3 y no 6, como es lógico. Compruébelo ejecutando las sentencias siguientes:

Base *Objeto1 = new Base();
delete Objeto1;
Derivada *Objeto2 = new Derivada();
delete Objeto2;
La técnica conocida como polimorfismo permite usar objetos de distintas clases, pero con una base común, de manera genérica. Es posible, por ejemplo, asignar una referencia de tipo Derivada a un puntero Base. Al destruir esa referencia, sin embargo, los destructores no se ejecutan en el orden correcto y el valor mostrado no es 3 sino 6, lo cual indica que se ejecutó el destructor Base antes que el destructor Derivada. Esto es anormal, puesto que el objeto era de la clase Derivada.
Para solucionar este problema basta con anteponer la palabra virtual en la definición del destructor de la clase base, lo cual implicará que el destructor sea virtual en todas las clases derivadas. Es algo que puede tomar como norma: defina los destructores siempre como virtuales, le evitará problemas.

82- Cadenas AnsiString
El tratamiento de cadenas de caracteres nunca ha sido uno de los puntos fuertes del lenguaje C++, en contraposición a otros como BASIC o Pascal. La simple operación de asignar una cadena a una variable, concatenar dos cadenas u obtener su longitud, por ejemplo, exige el uso de una serie de funciones bien conocidas por los programadores de C y C++, como strlen(), strcpy() o strcat(). Debido a esto los compiladores de C++ incorporan librerías que, como la STL (Standard Template Library), cuentan con clases que simplifican ese trabajo.
En C++ Builder, herramienta que dispone de una jerarquía de clases y componentes conocida como VCL, tenemos disponible la clase AnsiString, equivalente al tipo String que existe en Delphi. Lo más interesante de esta clase, aparte de facilitar el trabajo con cadenas de caracteres, es que puede utilizarse para realizar multitud de conversiones, tan sólo es necesario conocer los constructores y métodos con que cuenta. Algunos de esos métodos son estáticos, lo cual significa que podemos usarlos directamente, sin necesidad de crear un objeto AnsiString.
Mediante los métodos de la clase AnsiString es posible convertir un número decimal en hexadecimal, un valor de punto flotante en una cadena, una cadena en un número entero, convertir mayúsculas en minúsculas o viceversa, generar cadenas a partir de un cierto carácter, dar formato a datos en base a una cadena de descripción, analizar el contenido de una cadena para encontrar delimitadores y patrones, etc. Los operadores de esta clase simplifican el acceso individual a los caracteres, la concatenación y la comparación de cadenas.
Para efectuar una conversión de cualquier dato a cadena de caracteres, lo único que hay que hacer es crear un objeto AnsiString facilitando como parámetro ese dato. Es lo que se hace en el siguiente fragmento:

AnsiString Cadena = 103.7;
ShowMessage(Cadena);

Esto es posible gracias a la existencia de más de una docena de constructores diferentes en la clase AnsiString, constructores que son usados ante asignaciones como la anterior. En la figura puede ver algunos de esos constructores.

83- Cómo añadir nuevas palabras clave
La mayoría de las herramientas de desarrollo actuales cuenta con editores de código capaces de realzar el texto sintácticamente, haciendo más fácil y rápida la identificación de las palabras clave, comentarios, etc. En el caso concreto de Visual C++ existe la posibilidad de añadir una lista de palabras definidas por el usuario, palabras cuyo aspecto en el editor puede establecerse según nuestras preferencias.
Esto es especialmente interesante si usamos el entorno de Visual C++ para trabajar con otros lenguajes, por ejemplo C#, configurando adecuadamente el editor y las opciones para compilación.
Lo primero que hay que hacer es localizar el ejecutable msdev.exe que habitualmente se encuentra en la carpeta Common\MSDev98\Bin del directorio donde esté instalado Visual Studio. En esa carpeta crearemos un archivo de texto con el nombre usertype.dat, incluyendo en él todas las palabras clave del nuevo lenguaje a razón de una por línea.
Finalizada la edición del archivo de palabras clave, lo siguiente sería iniciar Visual C++ y elegir la opción Options del menú Tools. Ésta da paso a una ventana con múltiples páginas, de las cuales nos interesa la llamada Format que puede ver en la figura. No tenemos más que seleccionar el elemento User Defined Keywords de la lista Colors y definir la apariencia de esas palabras.
Completado todo el proceso, sólo resta comenzar a trabajar en un archivo C++ para comprobar cómo se diferencian las palabras clave de su lista del resto del código.

84- Cómo definir operadores para clases propias
Una de las cualidades más interesantes del lenguaje C++, sintácticamente hablando, es la posibilidad de definir operadores para las clases propias. Esto simplifica el uso de dichas clases al reducir el número de métodos a los que hay que invocar para realizar las tareas. Siempre es más sencillo disponer el operador ++ detrás del nombre de un objeto que tener que llamar a un hipotético método Incrementa(), o usar el operador estándar de inserción, <<, para añadir un elemento que llamar a un método Anade().
La definición de un operador en una cierta clase no se diferencia demasiado de la de cualquier método, contando con un valor de retorno y unos parámetros. La distinción es que, en lugar de facilitar un identificador propio, usaremos la palabra operator seguida del operador a de

Contenidos recomendados...

Comentar
Para comentar, es necesario iniciar sesión
Se muestran 0 comentarios
X

Uso de cookies

Esta web utiliza cookies técnicas, de personalización y análisis, propias y de terceros, para facilitarle la navegación de forma anónima y analizar estadísticas del uso de la web. Consideramos que si continúa navegando, acepta su uso. Obtener más información