Universidad de Costa Rica
Escuela de Ciencias de la
Computación e Informática
Profesor Adolfo Di Mare
CI-1201
I Semestre 2004
[<=] [home] [<>] [\/] [=>]
CI-1201 Programación II

Tarea #9 [solución]

Contador de referencias para la clase 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.

[mailto:] Entrega de Tareas

Tiempo de entrega: 7 días
Entregue su documentación en la primera fecha, y luego entregue el programa completo en la segunda fecha.
Primera etapa: 3 días
Modalidad: En parejas

Soluciones

[mailto:] Adolfo Di Mare <adolfo@di-mare.com>.
Copyright © 2004
Derechos de autor reservados © 2004
[home] <> [/\]