9.9. 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. Escriba un programa que use la macro F() mostrada al principio del capítulo y demuestre que no se expande apropiadamente, tal como describe el texto. Arregle la macro y demuestre que funciona correctamente.

  2. Escriba un programa que use la macro FLOOR() mostrada al principio del capítulo. Muestre las condiciones en que no funciona apropiadamente.

  3. Modifique MacroSideEffects.cpp de modo que BAND() funcione adecuadamente.

  4. Cree dos funciones idénticas, f1() y f2(). Haga inline a f1() y deje f2() como no-inline. Use la función clock() de la librería C estándar que se encuentra en <ctime> para marcar los puntos de comienzo y fin y compare las dos funciones para ver cuál es más rápida. Puede que necesite hacer un bucle de llamadas repetidas para conseguir números representativos.

  5. Experimente con el tamaño y complejidad del código de las funciones del ejercicio 4 para ver si puede encontrar el punto donde la función inline y la convencional tardan lo mismo. Si dispone de ellos, inténtelo con compiladores distintos y fíjese en las diferencias.

  6. Pruebe que las funciones inline hacen enlazado interno por defecto.

  7. Cree una clase que contenga un array de caracteres. Añada un constructor inline que use la función memset() de la librería C estándar para inicializar el array al valor dado como argumento del constructor (por defecto será ' '), y un método inline llamado print() que imprima todos los caracteres del array.

  8. Coja el ejemplo NestFriend.cpp del Capítulo 5 y reemplace todos los métodos con inline. No haga métodos inline in situ. También cambie las funciones initialize() por constructores.

  9. Modifique StringStack.cpp del Capítulo 8 para usar funciones inline.

  10. Cree un enumerado llamado Hue que contenga red, blue y yellow. Ahora cree una clase llamada Color que contenga un atributo de tipo Hue y un constructor que dé valor al Hue con su argumento. Añada métodos de acceso al Hue get() y set(). Haga inline todos los métodos.

  11. Modifique el ejercicio 10 para usar el enfoque «accesor» y «mutador».

  12. Modifique Cpptime.cpp de modo que mida el tiempo desde que comienza el programa hasta que el usuario pulsa la tecla «Intro» o «Retorno».

  13. Cree una clase con dos métodos inline, el primero que está definido en la clase llama al segundo, sin necesitar una declaración adelantada. Escriba un main() que cree un objeto de esa clase y llame al primer método.

  14. Cree una clase A con un constructor por defecto inline que se anuncie a sí mismo. Ahora cree una nueva clase B y ponga un objeto de A como miembro de B, y dele a B un constructor inline. Cree un array de objetos B y vea qué sucede.

  15. Cree una gran cantidad de objetos del ejercicio anterior, y use la clase Time para medir las diferencias entre los contructores inline y los no-inline. (Si tiene un perfilador, intente usarlo también).

  16. Escriba un programa que tome una cadena por línea de comandos. Escriba un bucle for que elimine un carácter de la cadena en cada pasada, y use la macro DEGUB() de este capítulo para imprimir la cadena cada vez.

  17. Corrija la macro TRACE() tal como se explica en el capítulo, y pruebe que funciona correctamente.

  18. Modifique la macro FIELD() para que también incluya un índice numérico. Cree una clase cuyos miembros están compuestos de llamadas a la macro FIELD(). Añada un método que le permita buscar en un campo usando el índice. Escriba un main() para probar la clase.

  19. Modifique la macro FIELD() para que automáticamente genere funciones de acceso para cada campo (data debería no obstante ser privado). Cree una clase cuyos miembros estén compuestos de llamadas a la macro FIELD(). Escriba un main() para probar la clase.

  20. Escriba un programa que tome dos argumentos de línea de comandos: el primero es un entero y el segundo es un nombre de fichero. Use requiere.h para asegurar que tiene el número correcto de argumentos, que el entero está entre 5 y 10, y que el fichero se puede abrir satisfactoriamente.

  21. Escriba un programa que use la macro IFOPEN() para abrir un fichero como un flujo de entrada. Fíjese en la creación un objeto ifstream y su alcance.

  22. (Desafío) Averigüe cómo conseguir que su compilador genere código ensamblador. Cree un fichero que contenga una función muy pequeña y un main(). Genere el código ensamblador cuando la función es inline y cuando no lo es, y demuestre que la versión inline no tiene la sobrecarga por la llamada.