5.8. Ejercicios

Las soluciones a los ejercicios se pueden encontrar en el documento electrónico titulado «The Thinking in C++ Annotated Solution Guide», disponible por poco dinero en www.BruceEckel.com.

  1. Cree una clase con atributos y métodos public, private y protected. Cree un objeto de esta clase y vea qué mensajes de compilación obtiene cuando intenta acceder a los diferentes miembros de la clase.

  2. Escriba una estructura llamada Lib que contenga tres objetos string a, b y c. En main() cree un objeto Lib llamado x y asígnelo a x.a, x.b y x.c. Imprima por pantalla sus valores. Ahora reemplace a, b y c con un array de cadenas s[3]. Dese cuenta de que su función main() deja de funcionar como resultado del cambio. Ahora cree una clase, llámela Libc con tres cadenas como datos miembro privados a, b y c, y métodos seta(), geta(), setb(), getb(), setc() y getc() para establecer y recuperar los distintos valores. Escriba una función main() como antes. Ahora cambie las cadenas privadas a, b y c por un array de cadenas privado s[3]. Vea que ahora main() sigue funcionando.

  3. Cree una clase y una función friend global que manipule los datos privados de la clase.

  4. Escriba dos clases, cada una de ellas con un método que reciba como argumento un puntero a un objeto de la otra clase. Cree instancias de ambas clases en main() y llame a los métodos antes mencionados de cada clase.

  5. Cree tres clases. La primera contiene miembros privados, y declara como friend a toda la segunda estructura y a una función miembro de la tercera. En main() demuestre que todo esto funciona correctamente.

  6. Cree una clase Hen. Dentro de ésta, inserte una clase Nest. Y dentro de ésta una clase Egg. Cada clase debe tener un método display(). En main(), cree una instancia de cada clase y llame a la función display() de cada una.

  7. Modifique el ejercicio 6 para que Nest y Egg contengan datos privados. De acceso mediante friend para que las clases puedan acceder a los contenidos privados de las clases que contienen.

  8. Cree una clase con atributos diseminados por numerosas secciones public, private y protected. Añada el método ShowMap() que imprima por pantalla los nombres de cada uno de esos atributos y su dirección de memoria. Si es posible, compile y ejecute este programa con más de un compilador y/o ordenador y/o sistema operativo para ver si existen diferencias en las posiciones en memoria.

  9. Copie la implementación y ficheros de prueba de Stash del capítulo 4 para así poder compilar y probar el Stash.h de este capítulo.

  10. Ponga objetos de la clase Hern definidos en el ejercicio 6 en un Stash. Apunte a ellos e imprímalos (si no lo ha hecho aún necesitará una función Hen::print()).

  11. Copie los ficheros de implementación y la prueba de Stack del capítulo 4 y compile y pruebe el Stack2.h de este capítulo.

  12. Ponga objetos de la clase Hen del ejercicio 6 dentro de Stack. Apunte a ellos e imprímalos (si no lo ha hecho aún, necesitara añadir un Hen::print()).

  13. Modifique Chesire en Handle.cpp, y verifique que su entorno de desarrollo recompila y reemplaza sólo este fichero, pero no recompila UseHandle.cpp.

  14. Cree una clase StackOfInt (una pila que guarda enteros) usando la técnica «Gato de Chesire» que esconda la estructura de datos de bajo nivel que usa para guardar los elementos, en una clase llamada StackImp. Implemente dos versiones de StackImp: una que use un array de longitud fija de enteros, y otra que use un vector<int>. Ponga un tamaño máximo para la pila preestablecido, así no se tendrá que preocupar de expandir el array en la primera versión. Fíjese que la clase StackOfInt.h no tiene que cambiar con StackImp.