[C con Clase] Ficheros en C++

Programante programante en gmail.com
Dom Nov 25 21:37:17 CET 2007


Paco Quintana escribió:
> Es verdad como se me puede ocurrir no mandar el código y los 
> resultados del compilador
> en que estaré pensando.....
> Bien, en los ficheros adjuntos teneis el proyecto con los cinco 
> archivos de códogo y otro con los reultados del compilador
> En los de códogo van las dos clases (Registro y Datos) con sus 
> respectivas implementaciones y en el fichero FicheroPrueba.cpp el main.
> espero vuesttas contestaciones, estoy deseando aprender
> Gracias...
Pues calro que te da un montón de errores. ¡No has añadido ni un include!
Omitir añadir una cabecera da errores largos como estos. La buena 
noticia es que es sencillo de arreglar.

En Datos.h
-Usas fstream, pero no está declarado. Solución: Añadir #include <fstream>
-Usas cin y cout pero no están declarados. Solución: Añadir #include 
<iostream>
Añadimos además using namespace std; para tener acceso directo a ello.
Finalmente, la clase Datos trabaja con Registro, pero no lo conoce. 
Solución: O bien pones en Datos.cpp #include "Registro.h"
 antes de #include "Datos.h" (con el inconveniente que tienes que 
acordarte de ponerlos siempre en ese orden), o pones #include 
"Registro.h" en Datos.h o bien le pones "class Registro;" aprovechando 
que no usas ese dato, sino sólo referencias.


Similarmente, en Registro.h
-Usas strcpy() sin que esté declarada. Solución: Añadir #include 
<cstring> y using namespace std;


Similarmente, en Registro.cpp
-Usas system() sin que esté declarada. Solución: Añadir #include <cstdlib>
-También cin y cout: #include <iostream>
-Usas setw: #include <iomanip>
-Usas LeeNumero() sin declararlo: Añadimos el prototipo al principio: 
long LeeNumero();


Et voilà. Ya compila.

Ahora unas consideraciones:
Defines el código de los constructores y destructores en el archivo de 
cabecera. Los constructores y destructores no son más que otras 
funciones. Deberían ir en el .cpp correspondiente (y no harían falta 
tantos includes en los .h).
Al heredar Datos de manera publica de fstream, el usuario puede llamar a 
funciones internas, como Datos.close()  dejando la clase en un estado 
inválido. Aunque esto lo evitas heredándolo como privado, la forma 
adecauda es usar composición, no herencia.
Puesto que los registros dependen de LeeNumero(), ésta no debería estar 
declarada en FicheroPrueba.
Los registros interaccionan directamente con la pantalla y el usuario.







Más información sobre la lista de distribución Cconclase