8. Redefiniendo la clase base para otro sistema
Curso: Introducción a C++, por Nacho Cabanes (antiguo)
8. Redefiniendo la clase base para otro sistema
Si queremos "adaptar" nuestra clase "PantallaTexto" para otro sistema (compilador y/o sistema operativo), tenemos dos opciones:- Crear una nueva clase que herede de la básica pero que redefina ciertas cosas.
- Crear una nueva clase base alternativa, en la que modifiquemos lo que nos interese.
En nuestro caso, vamos a crear una versión para Linux, usando "ncurses". Como nuestre clase base incluye cosas que son específicas de MsDos, no nos bastará con redefinir parte, porque aun así nuestro compilador protestaría, diciendo que no conoce "conio.h", ni órdenes como "gotoxy".
Por eso, vamos a usar la segunda opción: crear una nueva clase base. Sólo necesitamos cambiar unas pocas cosas:
- El constructor deberá encargarse de entrar al modo texto mejorado con "initscr()".
- De igual modo, el destructor deberá salir con "endwin()".
- Para borrar la pantalla usaremos "clear()".
- Para escribir, usaremos "move" en vez de "gotoxy", "printw" en lugar de "cprintf", y al final actualizaremos la información en pantalla con "refresh()".
El resto de la clase no debería cambiar. Con todo esto, el fuente (el inicial, que conserva todo en un único fichero) quedaría así:
1: //
2: // pant02L.cpp
3: //
4: // Introducción a C++
5: // Jose Ignacio Cabanes
6: // Segundo ejemplo (en un sólo fuente)
7: // Versión para GCC (Linux)
8: //
9: /////////////////////////////////////////////
10:
11: #include <curses.h>
12:
13: // ---------------------------------------------------------
14: // CLASE : PantallaTexto
15: // Oculta el funcionamiento de la pantalla en modo texto.
16:
17: class PantallaTexto {
18: char maxX, minX; // Coordenadas máxima y mínima (horizontal)
19: char maxY, minY; // Coordenadas máxima y mínima (vertical)
20:
21: public:
22: PantallaTexto(); // Método constructor
23: void Borra(); // Borra toda la pantalla
24: void Escribe(int X,
25: int Y, char *texto); // Escribe un mensaje en ciertas coordenadas
26: int LeeTecla(); // Espera una tecla y la devuelve
27: int LeerMaxX(); // Devuelve coordenada X máxima
28: int LeerMinX(); // Devuelve coordenada X mínima
29: int LeerMaxY(); // Devuelve coordenada Y máxima
30: int LeerMinY(); // Devuelve coordenada Y mínima
31: ~PantallaTexto(); // Método destructor
32: };
33:
34: // ===================================================================
35: // A continuación viene el desarrollo de las funciones (métodos)
36:
37:
38: // ----------------- PantallaTexto -------------------------
39: // Método constructor: valores iniciales
40:
41: PantallaTexto::PantallaTexto() {
42: maxX = 80; minX = 1;
43: maxY = 25; minY = 1;
44: initscr();
45: }
46:
47:
48: // ----------------- PantallaTexto - Borra -----------------
49: // Borra toda la pantalla
50:
51: void
52: PantallaTexto::Borra() {
53: clear();
54: }
55:
56: // ----------------- PantallaTexto - Escribe ---------------
57: // Escribe un mensaje en ciertas coordenadas
58:
59: void
60: PantallaTexto::Escribe(int X, int Y, char *texto) {
61: move(Y, X);
62: printw(texto);
63: refresh();
64: }
65:
66:
67: // ----------------- PantallaTexto - LeeTecla --------------
68: // Espera una tecla y la devuelve
69:
70: int
71: PantallaTexto::LeeTecla() {
72: return getch();
73: }
74:
75:
76: // ----------------- PantallaTexto - LeerMaxX ---------------
77: // Devuelve la coordenada horizontal máxima
78:
79: int
80: PantallaTexto::LeerMaxX() {
81: return maxX;
82: }
83:
84:
85: // ----------------- PantallaTexto - LeerMinX ---------------
86: // Devuelve la coordenada horizontal máxima
87:
88: int
89: PantallaTexto::LeerMinX() {
90: return minX;
91: }
92:
93:
94: // ----------------- PantallaTexto - LeerMaxY ---------------
95: // Devuelve la coordenada vertical máxima
96:
97: int
98: PantallaTexto::LeerMaxY() {
99: return maxY;
100: }
101:
102:
103: // ----------------- PantallaTexto - LeerMinY ---------------
104: // Devuelve la coordenada vertical mínima
105:
106: int
107: PantallaTexto::LeerMinY() {
108: return minY;
109: }
110:
111: // ----------------- PantallaTexto -------------------------
112: // Método destructor: no usado esta vez
113:
114: PantallaTexto::~PantallaTexto() {
115: // Aquí liberaríamos el espacio reservado, etc.
116: endwin();
117: }
118:
119:
120: // ===================================================================
121: // Finalmente: un programa sencillo de ejemplo
122:
123: main() {
124: PantallaTexto pant; // Definimos un objeto de clase "PantallaTexto"
125:
126: pant.Borra();
127: pant.Escribe(30,14, "Hola");
128: pant.LeeTecla();
129: return 0;
130: }
Para compilar este fuente desde Linux, deberíamos añadir la opción "-lncurses" para enlazar también las bibliotecas "ncurses" de acceso a pantalla.
En un caso general, si tenemos la clase desglosada en un fichero .h y un fichero .cpp, sólo sería necesario cambiar el fichero .cpp, porque el fichero .h no suele tener detalles que dependan del sistema.
Actualizado el: 15-05-2006 15:16