00001 #ifndef __KINDOF_HPP__ 00002 #define __KINDOF_HPP__ 00003 00004 /**********************************************************/ 00005 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00006 /* 00007 Copyright: 1997 - Grupo de Voz (DAET) ETSII/IT-Bilbao 00008 00009 Nombre fuente................ KINDOF.HPP 00010 Nombre paquete............... - 00011 Lenguaje fuente.............. C++ (Borland C/C++ 3.1) 00012 Estado....................... Utilizable 00013 Dependencia Hard/OS.......... - 00014 Codigo condicional........... - 00015 00016 Codificacion................. Borja Etxebarria 00017 00018 Version dd/mm/aa Autor Comentario 00019 ------- -------- -------- ---------- 00020 1.0.1 08/10/98 Borja Punto y coma en DECL(), versiones INLINE; 00021 1.0.0 17/09/97 Borja Codificacion inicial. 00022 00023 ======================== Contenido ======================== 00024 <DOC> 00025 Macros para implementar metodo isKindOf() y className 00026 en una clase. 00027 00028 Estos metodos tienen estos prototipos: 00029 virtual BOOL isKindOf(const CHAR *s ); 00030 virtual const CHAR *className( VOID ); 00031 00032 El primero permite comprobar si un objeto es de la clase nombrada 00033 por la cadena {s} (funciona tambien con clases derivadas). El 00034 segundo {devuelve} una cadena estatica interna que contiene el 00035 nombre de la clase del objeto. 00036 00037 Se utiliza asi: 00038 El la declaracion de la clase, en una seccion public 00039 anyadir esto: 00040 KINDOF_DECL(); 00041 00042 En algun fichero de implementacion de la clase, anyadir esto: 00043 KINDOF_BDEF(cname) 00044 o bien esto: 00045 KINDOF_DDEF(cname,cbase) 00046 El primero es para clases base, y el segundo para clases derivadas, 00047 siendo {cname} el nombre de la clase y {cbase} el nombre de la clase 00048 de la que derivamos. 00049 Cuidado con el punto y coma final, no hay que ponerlo salvo 00050 en KINDOF_DECL !! 00051 00052 Tambien hay versiones inline para declarar directamente en el .hpp. 00053 En tal caso no hace falta usar KINDOF_DECL() y directamente se puede 00054 poner en la declaracion de la clase: 00055 KINDOF_BDEF_INLINE(cname); 00056 o bien esto: 00057 KINDOF_DDEF_INLINE(cname,cbase); 00058 00059 </DOC> 00060 =========================================================== 00061 */ 00062 /*/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\*/ 00063 /**********************************************************/ 00064 00065 #include <string.h> 00066 00067 /**********************************************************/ 00068 00069 #define KINDOF_DECL() \ 00070 virtual BOOL isKindOf(const CHAR *s ) const; \ 00071 virtual const CHAR *className( VOID ) const 00072 00073 #define KINDOF_BDEF(cname) \ 00074 BOOL cname::isKindOf(const CHAR *s ) const { return !strcmp(#cname,s); } \ 00075 const CHAR * cname::className( VOID ) const { return #cname; } 00076 00077 #define KINDOF_DDEF(cname,cbase) \ 00078 BOOL cname::isKindOf(const CHAR *s ) const { return strcmp(#cname,s)?cbase::isKindOf(s):TRUE; } \ 00079 const CHAR * cname::className( VOID ) const { return #cname; } 00080 00081 #define KINDOF_BDEF_INLINE(cname) \ 00082 virtual BOOL isKindOf(const CHAR *s ) const { return !strcmp(#cname,s); } \ 00083 virtual const CHAR * className( VOID ) const { return #cname; } 00084 00085 #define KINDOF_DDEF_INLINE(cname,cbase) \ 00086 virtual BOOL isKindOf(const CHAR *s ) const { return strcmp(#cname,s)?cbase::isKindOf(s):TRUE; } \ 00087 virtual const CHAR * className( VOID ) const { return #cname; } 00088 00089 /**********************************************************/ 00090 00091 #endif 00092