Universidad de Costa Rica
|
|
Astring
class Astring { private: char * _s; static char null; // "" == hilera nula // ... }; // Astring |
El
Rep de la clase
"Astring
" contiene únicamente el
puntero
"_s
" a la hilera que contiene el valor de la
instancia. Su
trabajo consiste en incorporarle a la clase la posibilidad de usar
una cuenta de referencias, de manera que cuando se haga una
asignación mediante el operador de copia
Astring::operator =()
, no sea necesario crear una
copia de la hilera, sino que baste aumentar el contador de la
instancia. Por eso, el destructor destruye la hilera
"_s
" sólo cuando el contador de referencias
llega a cero.
Este cambio es bastante drástico, pues obliga a cambiar el Rep de la clase para que incluya el contador. Una manera de construir la implementación es usar un registro intermedio que contenga la cuenta de referencias y el puntero al valor de la hilera.
Si se usa la clase hilera con contador de referencias llega a
cero, el siguiente bloque de código no crea 3 duplicados
del valor "El valor de la hilera"
que está en cada una de las 3 hileras "S1
",
"S2
" y "S3
":
Astring S1 = "El valor de la hilera"; Astring S2 = S1; Astring S3; // ... S3 = S2;
Hay varias formas de introducir un contador de referencias para la
clase "Astring
". La forma más directa es usar
un registro intermedio que esté entre el
Rep
de "Astring
" y el valor de la hilera.
Astring S1; +----+ | _r-|------------\ +----+ | \|/ Astring S2; v +----+ +------+----+ | _r-|-------->| #==3 | _s-|------> "El valor de la hilera" +----+ +------+----+ ^ Astring S3; /|\ +----+ | | _r-|------------/ +----+ |
Otra forma de lograr el mismo objetivo es poner el valor de la hilera al final del registro de cuentas. Esta forma de hacer las cosas tiene el inconveniente de que es más difícil escribir una implementación que sea portable, pues requiere adquirir un bloque de memoria dinámica de longitud variable.
Astring S1; +----+ | _r-|------------\ +----+ | \|/ Astring S2; v +----+ +------+-------------------------+ | _r-|-------->| #==3 | "El valor de la hilera" | +----+ +------+-------------------------+ ^ Astring S3; /|\ +----+ | | _r-|------------/ +----+ |
Su trabajo consiste en
implementar
la clase "Astring
" de manera que la nueva
versión pueda usar contadores de referencia. Sin embargo,
Usted no debe cambiar la
especificación
de la clase, de manera que los programas que usan esta nueva
implementación o la anterior puedan funcionar
correctamente. Use directivas de compilación condicional
para que ambas implementaciones coexistan en los mismos archivos
de encabezado e implementación ("*.h
" &
"*.cpp
").
Entregue su tarea por correo electrónico, como lo hizo anteriormente.
Tiempo de entrega: | 7 días |
|
|
Primera etapa: | 3 días | ||
Modalidad: | En parejas |
Adolfo Di Mare <adolfo@di-mare.com>.
|