AnteriorPosterior

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

AnteriorPosterior