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.
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.
Escriba un programa que use la macro
FLOOR()
mostrada al principio del
capítulo. Muestre las condiciones en que no funciona
apropiadamente.
Modifique MacroSideEffects.cpp
de modo
que BAND()
funcione adecuadamente.
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.
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.
Pruebe que las funciones inline hacen enlazado interno por defecto.
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.
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.
Modifique StringStack.cpp
del Capítulo
8 para usar funciones inline.
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.
Modifique el ejercicio 10 para usar el enfoque «accesor» y «mutador».
Modifique Cpptime.cpp
de modo que mida el
tiempo desde que comienza el programa hasta que el usuario
pulsa la tecla «Intro» o «Retorno».
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.
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.
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).
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.
Corrija la macro TRACE()
tal como se
explica en el capítulo, y pruebe que funciona correctamente.
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.
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.
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.
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.
(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.