Sobre Carta

 
 
Clasificación Intención Otros nombres Motivación Aplicabilidad Estructura
Consecuencias Implementación Patrones Relacionados  
 

Clasificación

Idioms en C++
 

Intención

Esconder clases de implementación a un usuario de una librería. Liberar símbolos del ámbito general.
 

Otros nombres

Envelope Letter
 

Motivación

Observando el idiom Manija-Cuerpo e idioms relacionados, se puede deducir que la clase cuerpo nunca es manipulada directamente por el usuario. En este caso es mejor ocultar esta segunda clase al usuario y permitir que las dos sean manipuladas como un mismo módulo. Esto se puede lograr definiendo la clase Cuerpo dentro de la parte privada de la clase Manija.
 

Aplicabilidad

Puede usarse cuando la interfaz de la clase Cuerpo solo es visible para la Manija, y cuando la Manija solo utiliza Cuerpos de una sola Clase. Este idiom es muy útil para mantener abstracciones estables, ya que cualquier cambio en la Carta causa recompilación automática en el Sobre.
 

Estructura

Es la misma que la definida para el idiom Manija-Cuerpo, pero con la salvedad que la clase Cuerpo es definida al interior de la clase Manija.
 
 

Consecuencias

La clase Cuerpo solo es visible para la Manija.
 

Implementación

En el caso de la clase String, la implementación sería:
 
 
class String
{
public:
  String( )
  {
    rep = new StringRep("");
  }
  String( const Strig& s )
  {
    rep = s.rep; rep->count++;
  }
  String& operator=( const String& s ) // asignación
  {
    s.rep->count++;
    if( --rep->count <= 0 ) delete rep;
    rep = s.rep;
    return *this;
  }
  ~String( ) // Destructor
  {
    if( --rep->count <= 0 ) delete rep;
  }
  String( const char* s )
  {
    rep = new StringRep(s);
  }
  String operator+( const String&) const;
  int length() const
  {
    return ::strlen(rep->rep);
  }
private:
  StringRep* rep;
 class StringRep
 {
 public:
  StringRep( const char* s )
  {
    ::strcpy(rep=new char[::strlen(s)+1], s ); count =1;
  }
  ~StringRep() 
  {
    delete[] rep;
  }
 private:
  char* rep;
  int count;
 };
};
 
 
 

Patrones relacionados

Manija-Cuerpo