Cuando manejamos herencia, a veces es necesario poder diferenciar entre varias clases heredadas. Una forma ordenada de hacerlo, es declarar una variable tipo que nos identifique con que clase estamos trabajando. Otra opción es realizando un casting dinámico para aprovechar las propiedades RTTI (Run-time type information) de los objetos de C++. Si el casting nos regresa NULL es que no es del tipo que nos interesa.
A continuación presento un ejemplo que ilustra esta técnica:
#include <iostream>
using namespace std;
class Figura {
public:
// Es importante que la clase base sea polimorfica agregándole al menos una función virtual:
virtual ~Figura() { };
};
class Triangulo : public Figura {
};
class Cuadrado : public Figura {
};
main() {
Figura *figura1 = new Cuadrado;
Figura *figura2 = new Triangulo;
if ( dynamic_cast<Cuadrado *>( figura1 ) )
cout <<"La figura1 es un Cuadrado" <<endl;
else if ( dynamic_cast<Triangulo *>( figura1 ) )
cout <<"La figura1 es un Triangulo" <<endl;
if ( dynamic_cast<Cuadrado *>( figura2 ) )
cout <<"La figura2 es un Cuadrado" <<endl;
else if ( dynamic_cast<Triangulo *>( figura2 ) )
cout <<"La figura2 es un Triangulo" <<endl;
return 0;
}
Aquí lo puedes ver en acción: http://www.ideone.com/xAmv72e5
Supongamos que tenemos las siguientes clases:
#include <iostream>
#include <boost/shared_ptr.hpp>
using namespace std;
class Base {
public:
virtual void imprime() { cout <<"Función imprime de la Clase Base" <<endl; }
virtual ~Base() { cout <<"Destructor de la Clase Base" <<endl; }
};
typedef boost::shared_ptr<Base> base_ptr;
class Derivada : public Base {
public:
virtual void imprime() { cout <<"Función imprime de la Clase Derivada" <<endl; }
virtual ~Derivada() { cout <<"Destructor de la Clase Derivada" <<endl; }
};
typedef boost::shared_ptr<Derivada> derivada_ptr;
Y queremos hacer esto:
int main
() {
derivada_ptr derivada( new Derivada );
base_ptr base( derivada );
base->imprime();
// La siguiente línea no va a compilar:
derivada_ptr regreso( base );
return EXIT_SUCCESS;
}
En la tercera declaración, nos va a marcar este error al compilar:
/usr/include/boost/shared_ptr.hpp:194: error: conversión inválida de ‘Base* const’ a ‘Derivada*’
Obviamente, necesitamos un casting. La forma para hacerlo sería así:
int main
() {
derivada_ptr derivada( new Derivada );
base_ptr base( derivada );
base->imprime();
// Ahora si compila:
derivada_ptr regreso( boost::static_pointer_cast<Derivada>( base ) );
return EXIT_SUCCESS;
}
Al ejecutar el programa, obtenemos esta salida:
Función imprime de la Clase Derivada
Destructor de la Clase Derivada
Destructor de la Clase Base
Como se ve, el smart pointer funcionó a la perfección a pesar de todas las transformaciones.
Tagged as:
Boost,
c++
Para mí, una de las razones para considerar seriamente a boost en cualquier proyecto en C++ es su implementación de functores. Realmente facilita mucho la creación de funciones "callback" y "delegates" sin causar mucha penalización en el rendimiento de un programa.
¿Porqué facilita el trabajo si los callbacks bien se pueden hacer con tan solo un apuntador a función? La respuesta es fácil si estas trabajando con un enfoque orientado a objetos. Para usar un apuntador a una función miembro, esta necesita ser estática o ser llamada con ayuda de su objeto. Las dos cosas bastante engorrosas.
Veamos como se sortea estos inconvenientes usando boost:
#include <iostream>
#include <boost/function.hpp>
#include <boost/bind.hpp>
using namespace std;
class Callback {
public:
void set_callback_function( boost::function<void()> function ) {
this->callback_function = function;
}
void execute_callback_function() {
if( !callback_function.empty() )
callback_function();
}
private:
boost::function<void ()> callback_function;
};
class MiClase {
public:
void funcion() {
cout <<"¡iujú! ¡Si se llamó!" <<endl;
}
};
int main() {
Callback callback;
MiClase miclase;
callback.set_callback_function( boost::bind( &MiClase::funcion, &miclase ) );
callback.execute_callback_function();
return EXIT_SUCCESS;
}
Probando el código en línea
En la siguiente URL, puedes probar este programa en línea: http://www.ideone.com/hbMXbtFR
La biblioteca TinyXML es muy liviana y permite parsear rapidamente XMLs sin tener que hacer mucho formalismo. En este post presento un código de ejemplo:
El xml que queremos parsear como ejemplo es el siguiente:
<?xml version="1.0">
<ELEMENT attribute="attribute">
<CHILD>child</CHILD>
</ELEMENT>
A continuación el programa de ejemplo en c++ que realiza el parseo:
#include <iostream>
#include "tinyxml.h"
using namespace std;
int main() {
TiXmlDocument doc;
if ( !doc.LoadFile( "ejemplo.xml" ) ) {
cout <<"Error: Can't load file ejemplo.xml" << endl;
return EXIT_FAILURE;
}
string attribute, childi_value;
TiXmlElement *element;
element = doc.FirstChildElement( "ELEMENT" );
if ( element->Attribute( "attribute" ) != NULL )
attribute = string ( element->Attribute( "attribute" ) );
cout <<"attribute: " <<attribute <<endl;
TiXmlElement* child = element->FirstChildElement("CHILD");
if ( child != NULL )
child_value = string( ( ( child->FirstChild() )->ToText() )->Value() );
cout <<"child value: " <<child_value <<endl;
return EXIT_SUCCESS;
}
El cual compilamos con:
g++ -o main main.cpp -ltinyxml
En este post, iré poniendo mis libros favoritos que traten sobre programación y computadoras. Desafortunadamente, muchos de ellos se irán haciendo obsoletos con el paso del tiempo. Los trataré de mantener conforme sigan vigentes.
|
Sistemas Emergentes
Este libro de Steven Johnson nos explica como la naturaleza se organiza para crear comportamientos inteligentes en sus elementos primitivos y los más "evolucionados" como el hombre. Se discute como se emergen conductas inteligentes ya sea con los individuos de una especie o millones de ellos en comunidad; lo que antes se conocía como "inteligencia colectiva" y que se aprecia ya sea en un hormiguero o en metrópolis como la Ciudad de México.
Por supuesto que este entendimiento es aplicable a la informática y nos explica como es posible que dentro del caos del Internet, sitios como la Wikipedia que esta dispuesta al libre albedrío de los internautas sea ahora una de nuestras fuentes de conocimiento más valiosa y fracasen esfuerzos como su contra-parte Encarta. Hay otros ejemplos como el Internet vs MSN ¿A la larga pasará lo mismo con aplicaciones cerradas con el surgimiento del software libre?
Las aplicaciones son tremendas en video-juegos y han funcionado para recomendar libros en sitios como Amazon. Además el libro tiene mucha historia de personajes claves como Turing. Altamente recomendado.
|
|
Gödel, Escher, Bach - Una eterna trenza dorada
Este libro lo conocí gracias a mi hermano, que lo estaba leyendo él cuando estudiaba en la universidad. Me intrigó y lo leí. Conforme pasaba las hojas, descubría muchas cosas que ya intuía de la naturaleza y otras que modificaron mi forma de ver el mundo desde esos días. Con él comprendí los alcances de la ciencia y los paralelismos de las leyes de la naturaleza en campos tan distantes como matemáticas, budismo zen, música, programación e Inteligencia Artificial.
Desafortunadamente, el tiempo no pasa en vano y ya hay muchos avances tecnológicos que por obvias razones no se tocan y algunos de los conocimientos se sienten un poco atrasados para los nuevos lectores. Aún así lo considero un excelente libro.
|
|
Los tres pilares del zen
Este libro no es propiamente de programación, pero si de una filosofía que tiene métodos de entrenamiento que pueden ser muy útiles para las personas que necesitan abstraer la esencia de las cosas o que necesitan acallar los pensamientos que distraen y conseguir así una mente ordenada.
Philip Kapleau logra con éxito explicar e introducirnos al zen a nosotros los profanos, sin desviarnos de lo que realmente es y sin dar falsas imágenes eruditas o seudocientíficas. Debo confesar que además de las técnicas de concentración, su filosofía me gusta mucho porque tiene muchas coincidencias con mi propia cosmovisión.
|
|
Sistemas Operativos
La primera edición de este libro la leí aproximadamente en el año de 1992 y me permitió entender como funcionaba la multitarea y los sistemas de manejo de memoria como la paginación. Afortunadamente ya había visto estos conceptos en acción desde 1988 con mi Color Computer porque el MS-DOS que use después no llegaba a tanto. Hice algunos pequeños experimentos con el procesador Z80 que usaba en aquella época para probar algunos de los conocimientos adquiridos.
Desafortunadamente, este libro ya no esta a la venta y es una verdadera pena porque el autor explica los conceptos de una manera sencilla. Quizás las nuevas técnicas para construir kernels lo opacarían hoy en día, pero tengo mis dudas porque estoy seguro que su valor sigue siendo vigente para entender los conceptos y para el uso de micro-controladores que no requieren hacer un Linux desde cero.
|
|
Computer Organization and Design
Otro libro para conocer los adentros de las estas máquinitas que cambiaron al mundo. Es un excelente libro introductorio y contiene toda la información necesaria no sólo para entender los partes de las computadoras sino también para diseñarlas. Gracias a este libro yo construí mi propio microprocesador.
Incluye apéndices y un CD con mucha información extra de igual valor a la de este excelente libro.
|
|
The C++ Programing Language
Sin duda, este es uno de los mejores libros para comprender al lenguaje C++. Aunque no sea propiamente para principiantes; el mismo creador del lenguaje nos explica su filosofía y las razones detrás de su diseño con justificaciones y ejemplos. Sólo por esto, vale la pena su lectura.
Además es un excelente manual donde se puede consultar hasta el aspecto más oscuro o extraño que se le pueda ocurrir al programador más inquieto.
|
|
Data Structures with C++ using STL
A estas alturas del partido, este libro ya está algo obsoleto, no es propiamente de STL y quizás el estilo de programación de los autores no sea el mejor. Pero, es un tutorial que nos enseña los principios de las estructuras de datos y al mismo tiempo tiene los ejemplos más comunes de la STL. Yo a la fecha, siempre lo tengo en mi escritorio y no es raro que lo este consultando constantemente.
|
Tagged as:
Libros