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 asigne valores 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]. Compruebe que su función main() deja de funcionar como resultado del cambio. Ahora cree una clase, llámela Libc con tres cadenas como atributos 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]. Compruebe 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 clase 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. Dé acceso mediante friend para que las clases que las contienen puedan acceder a esos datos privados.

  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 computador y/o sistema operativo para ver si existen diferencias en las posiciones en memoria.

  9. Copie los ficheros de implementación y 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 Hen definida en el ejercicio 6 en un Stash. Extráigalos 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. Extráigalos e imprímalos (si no lo ha hecho aún, necesitará añadir un Hen::print()).

  13. Modifique Cheshire en Handle.cpp, y verifique que su gestor de proyectos recompila y reenlaza sólo este fichero, pero no recompila UseHandle.cpp.

  14. Cree una clase StackOfInt (una pila que guarda enteros) usando la técnica del «gato de Cheshire» 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>. Fije de antemano un tamaño máximo para la pila, así no se tendrá que preocupar de expandir el array en la primera versión. Fíjese en que la clase StackOfInt.h no tiene que cambiar con StackImp.