1. La siguiente clase no inicializa bien su información. El atributo
familiares queda con un valor indefinido despues de su construcción.
Si el objeto se crea y seguidamente se destruye, causara un error.
class PersonaRep {
friend class Persona;
public:
PersonaRep( const char* n, const char* t ) {
nom = String(n);
tel = String(t);
count =1;
}
~PersonaRep() {
delete[] familiares;
}
private:
String nom;
String tel;
Persona* familiares;
int count;
};
|
Persona&
Persona::operator = ( const Persona& p )
{
p.rep->count++;
cout << "Referencia " << p.rep->count;
if( --rep->count <= 0 )
delete rep;
rep = p.rep;
return *this;
cout << "Referencia " << p.rep->count;
};
|
3. Los atributos de una clase deben ser privados, por mucho protegidos...
El siguiente código es en ejemplo de una clase que no cumple con
esta regla
class StringRep
{
private:
typedef char *Char_p;
public:
StringRep(StringRep::Char_p * const r)
{
rep = *r;
*r = NULL;
count = 1;
}
StringRep(const char *s)
{
::strcpy(rep = new char[::strlen(s) + 1],s);
count = 1;
}
~StringRep()
{
delete [] rep;
}
char *rep;
int count;
};
|
PersonaRep::PersonaRep()
{
count = 0;
numFamiliares = 0;
}
|
class Persona
{
public:
...
private:
PersonaRep *rep;
Persona * familiares[MAX];
};
|
Persona::Persona(const char *nombre, const char *tel)
{
String nom(nombre);
String telf(tel);
rep = new PersonaRep(nom,telf);
}
|
// Includes #include "/usr1/cursos/sistemas/a49401/a49401XX/taller1/string.c" |
// Includes #include "string.h" |
8. El siguiente código
void
Persona::imprimir() const
/*-----------------------------------------------------------------------
Muestra la informacion de la persona y de sus familiares
-----------------------------------------------------------------------*/
{
int i;
char cad[100];
cout << "Nombre : " << ref->nombre.asChar();
cout << "\tTelefono: " << ref->tel.asChar();
cout << "\n" << "Familiares: \n";
for ( i = 0; i < numFamiliares(); i++ ) {
cout << "Nombre : " << ref->familiares[i]->getNombre().asChar();
cout << "\tTelefono : " << ref->familiares[i]->getTel().asChar() << "\n";
}
}
|
void
Persona::imprimir() const
/*-----------------------------------------------------------------------
Muestra la informacion de la persona y de sus familiares
-----------------------------------------------------------------------*/
{
int i;
char cad[100];
cout << "Nombre : " << ref->nombre.asChar();
cout << "\tTelefono: " << ref->tel.asChar();
cout << "\n" << "Familiares: \n";
for ( i = 0; i < numFamiliares(); i++ ) {
ref->familiares[i]->imprimir();
}
}
|
9. Métodos no inline no deben ir declarados en el .h de una clase
Algunas de las características encontradas en el código son:
1. Uso de constantes en vez de macros.
Es mejor utilizar
// --------------------- Declaración de Constantes ---------------------- const int MAX = 20; |
// --------------------- Declaración de Constantes ---------------------- #define MAX 20 |
2. Es indispensable tener alguna documentación del uso
de patrones en las clases, para faciltar la identificación de la
estructura. Por ejemplo
//
// Patron envelope(persona) letter(PersonaRep)
//
class Persona
{
...
|
Los errores encontrados por cuenta son:
| 01 | 1, 2, incompleto, warning en compilación |
| 02 | No esta |
| 03 | No hay permiso de lectura |
| 04 | No hay permiso de lectura |
| 05 | 2, 3, 4, 5, 6, no es Sobre-Carta, fallas en ejec. |
| 06 | No hay permiso de lectura |
| 07 | 7, No Sobre-Carta, No Conteo-Refs, No main, warnings en compilación |
| 08 | No hay permiso de lectura |
| 09 | No hay permiso de lectura de los archivos en taller1 |
| 10 | No hay permiso de lectura |
| 11 | 1, 8, Fallas en ejecución |
| 12 | No Handle-Body, Info. Duplicada, sin menu, core al final. |
| 13 | 5, Error de ejecución, |
| 14 | 5, 9, Innecesaria clase datos, Error ejecución (cambioNombre) |
| 15 | Mal uso idioms, versiones 2 y 3, redeclaración de clases, error de compilación |
| 16 | Nada |
| 17 | 1, 3, 8, No menu. error de ejecución (cambiarNombre) |
| 18 | 8, Mal uso de Conteo-Referencias (No se actualiza bien la representación). Error en la ejecución (cambiarNombre) |
| 19 | 7, 8, Error de ejecución (copia) |
| 20 | No hay permiso de lectura |
| 21 | 5, 8, No Sobre-Carta |