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.
Cree una clase Text que
contenga un objeto string para que
guarde el texto de un fichero. Póngale dos constructores: un
constructor por defecto y un constructor que tome un
argumento de tipo string que sea el
nombre del fichero que se vaya a abrir. Cuando se utilice el
segundo constructor, abra el fichero y ponga su contenido en
el atributo string. Añada un método
llamado contents() que retorne el
string para que, por ejemplo, se pueda
imprimir. En main() abra un fichero
utilizando Text e imprima el contenido
en pantalla.
Cree una clase Message con un
constructor que tome un sólo string con
un valor por defecto. Cree un atributo privado
string y asigne en el constructor el
argumento string al atributo
string. Cree dos métodos sobrecargados
llamados print(): uno que no tome
argumentos y que imprima simplemente el mensaje guardado en
el objeto, y el otro que tome un argumento
string, que imprima el mensaje interno
además del argumento. ¿Tiene sentido utilizar esta
aproximación en vez de la utilizada por el constructor?
Descubra cómo generar código ensamblador con su compilador y haga experimentos para deducir el esquema de decoración de nombres.
Cree una clase que contenga cuatro métodos con 0,
1, 2 y 3 argumentos de tipo int
respectivamente. Cree un main() que
haga un objeto de su clase y llame a cada método. Ahora
modifique la clase para que tenga sólo un método con todos
los argumentos por defecto. ¿Eso cambia su
main()?
Cree una función con dos argumentos y llámela desde
main(). Ahora haga que uno de los
argumentos sea un argumento de relleno (sin identificador) y
compruebe si necesita hacer cambios en
main().
Modifique Stash3.h y
Stash3.cpp para que el constructor
utilice argumentos por defecto. Pruebe el constructor
haciendo dos versiones diferentes de un objeto
Stash.
Cree una nueva versión de la clase Stack
(del Capítulo 6) que contenga el constructor por defecto al
igual que antes, y un segundo constructor que tome como
argumentos un array de punteros a objetos y el tamaño del
array. Este constructor debería recorrer el array y poner cada
puntero en la pila (Stack). Pruebe su
clase con un array de string's.
Modifique SuperVar para que haya
#ifdef's que engloben el código de
vartype tal como se describe en la
sección sobre enumeraciones. Cambie
vartype como una enumeración pública (sin
ejemplares) y modifique print() para
que requiera un argumento de tipo vartype
que le indique qué tiene qué hacer.
Implemente Mem2.h y asegúrese
de que la clase modificada todavía funciona con
MemTest.cpp.
Utilice la clase Mem para implementar
Stash. Note que debido a que la
implementación es privada y por tanto oculta al programador
cliente, no necesita modificar el código de prueba.
Añada un método bool moved() en la
clase Mem que tome el resultado de
una llamada a pointer() y le diga si el
puntero ha cambiado (debido a una reasignación). Escriba una
función main() que pruebe su método
moved(). ¿Tiene más sentido utilizar
algo como moved() o simplemente invocar
pointer() cada vez que necesite acceder
a la memoria de Mem?