• Miércoles 20 de Noviembre de 2024, 08:40

Autor Tema:  clases en diferentes ficheros y stdafx.h  (Leído 4592 veces)

picyo

  • Visitante
clases en diferentes ficheros y stdafx.h
« en: Sábado 26 de Junio de 2010, 17:47 »
0
-Hola, cuando creo clases desde por ejemplo, el programa principal, no tengo ningún problema. Ahora "superado" eso, quiero implementar clases usando archicos "*.cpp" y "*.h"

Código: C++
  1. //  Punto.h
  2. #ifndef PuntoH
  3. #define PuntoH
  4. class Punto
  5. {
  6. private
  7.     double x,y;
  8. public:
  9.     Punto():
  10.     Punto(double a, double b);
  11.     ~Punto();   
  12. };
  13. #endif
  14.  
y el archivo *cpp
Código: C++
  1. #include "Punto.h"
  2. Punto::Punto()
  3. {
  4. x=y=0;
  5. } 
  6. Punto::~Punto(){}
  7.  

y el main()
Código: C++
  1. // main_clases.cpp : main project file.
  2.  
  3. //#include "stdafx.h"
  4. #include <iostream>
  5.  
  6.  
  7. using namespace System;
  8. using namespace std;
  9.  
  10. int main(array<System::String ^> ^args)
  11. {
  12.     Console::WriteLine(L"Hello World");
  13.     return 0;
  14. }
  15.  

Al compilar me salen estos errores y warnings:
Código: C++
  1.  
  2. Warning 1   warning C4627: '#include "Punto.h"': skipped when looking for precompiled header use    c:Visual StudioejerciciosBegining Visual C++ 2008Examplesclasesmain_clasesmain_clasesPunto.cpp  1   main_clases
  3.  
  4. Error   2   fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? c:Visual StudioejerciciosBegining Visual C++ 2008Examplesclasesmain_clasesmain_clasesPunto.cpp  9   main_clases
  5.  
  6. Warning 3   warning C4627: '#include <iostream>': skipped when looking for precompiled header use   c:Visual StudioejerciciosBegining Visual C++ 2008Examplesclasesmain_clasesmain_clasesmain_clases.cpp    4   main_clases
  7.  
  8. Error   4   fatal error C1010: unexpected end of file while looking for precompiled header. Did you forget to add '#include "stdafx.h"' to your source? c:Visual StudioejerciciosBegining Visual C++ 2008Examplesclasesmain_clasesmain_clasesmain_clases.cpp    15  main_clases
  9.  

Respecto el fichero stdfx.h no lo he querido poner ( uso Visual Studio) porque prefiero usar un método lo mas global posible, no depender de un compilador u otro ( usar al maximo el ISO, mientras no tenga necesidad de usar WindowForms, etc) y es por eso que veo que se substtituye por los #ifndef PuntoH... del archivo de cabecera. Pero al crear el archivo punto.cpp es cuando me da error al compilar.

* ¿ De qué forma puedo substituir correctamente las típocas lineas de #Pragma y fichero stdfx.h ?
*  ¿ Es realmente útil el archivo de encabezado "*.h", no bastaría con crear una clase desde su fichero "*.cpp" ?

Gracias!
( y gracias Villa :p )

picyo

  • Visitante
Re: clases en diferentes ficheros y stdafx.h
« Respuesta #1 en: Sábado 26 de Junio de 2010, 19:10 »
0
Bueno he visto que desde opciones se puede eliminar esto del stdfx.h, y asi lo he hecho ( es aconsejable?)
Respecto la otra pregunta, aun tengo dudas del porque "oficialmete" se separan tanto los ficheros para hacer una clase

Amilius

  • Miembro HIPER activo
  • ****
  • Mensajes: 665
    • Ver Perfil
Re: clases en diferentes ficheros y stdafx.h
« Respuesta #2 en: Domingo 27 de Junio de 2010, 13:51 »
0
Efectivamente usar precompilados (incluir stdfx.h en los cpp) es opcional, pero reduce el tiempo de compilación así que no es necesario en proyectos chicos. De todas formas me parece que podrías usar otros compiladores y tener un stdfx.h en blanco.

¿Por que tener separado el .h del .cpp?

1. Por diseño: separación de interfaz de implementación, ocultar detalles de implementación. Muy importante al crear DLLs para mantener compatibilidad entre versiones.
2. Reduce tiempo de compilación: Tienes que tener en cuenta que antes de compilar un ".cpp" prácticamente se hace un "copy/paste" de todos los "include" dentro del archivo .cpp.

Por lo anterior cuanto más grande sea tu proyecto cuanto más importante es tener un .h y un .cpp por clase. Para códigos pequeños, como algún ejemplo de uso, no es relevante.

picyo

  • Visitante
Re: clases en diferentes ficheros y stdafx.h
« Respuesta #3 en: Domingo 27 de Junio de 2010, 14:48 »
0
Ok, merci!
Entonces el encabezado (lo que seria para todo el mundo)seria siempre algo como :

Código: C++
  1. //clase.h
  2. class clase{}
  3. public:
  4. int una;
  5. int funcion(int a);
  6. ;
  7.  
  8.  

y la implementacion(que seia por parte de cada programador según como querría gestionar la clase?):
Código: C++
  1.  
  2. #include "clase.h"
  3. clase::funcion(int a){       // dónde pongo la variable que devuelve la función?
  4.                             a=2*a;
  5.                            return a;
  6.                             }
  7. }
  8.  

Asi es ams o menos como lo entiendo, pero siguiendo un ejemplo del libtro de Ivor, no veo nada claro :

fichero .h
Código: C++
  1. #pragma once
  2.  
  3. class CBox
  4. {
  5. public:
  6.  CBox(double lv = 1.0, double wv = 1.0, double hv = 1.0);public:
  7. public:
  8.  ~CBox(void);
  9.  
  10. private:
  11.    // Length of a box in inches
  12.    double m_Length;
  13.    // Width of a box in inches
  14.    double m_Width;
  15.    // Height of a box in inches
  16.    double m_Height;
  17. public:
  18.    double GetHeight(void)
  19.    {
  20.      return m_Height;
  21.    }
  22. public:
  23.  
  24.   double GetWidth(void)
  25.   {
  26.     return m_Width;
  27.   }
  28. public:
  29.  
  30.   double GetLength(void)
  31.   {
  32.     return m_Length;
  33.   }
  34. public:
  35.  
  36.   double Volume(void) const
  37.   {
  38.     return m_Length*m_Width*m_Height;
  39.   }
  40. public:
  41.   // Overloaded addition operator
  42.   CBox operator+(const CBox& aBox) const;
  43. public:
  44.   // Multiply a box by an integer
  45.   CBox operator*(int n) const;
  46. public:
  47.   // Divide one box into another
  48.   int operator/(const CBox& aBox) const;
  49. };
  50.  
fichero .cpp
Código: C++
  1. #include "Box.h"
  2.  
  3. CBox::CBox(double lv, double wv, double hv)
  4. : m_Length(0)
  5. {
  6.   lv = lv <= 0.0 ? 1.0 : lv;           // Ensure positive
  7.   wv = wv <= 0.0 ? 1.0 : wv;           // dimensions for
  8.   hv = hv <= 0.0 ? 1.0 : hv;           // the object
  9.  
  10.   m_Length = lv>wv ? lv : wv;          // Ensure that
  11.   m_Width = wv<lv ? wv : lv;           // length >= width
  12.   m_Height = hv;
  13. }
  14.  
  15. CBox::~CBox(void)
  16. {
  17. }
  18.  
  19.  
  20. // Overloaded addition operator
  21. CBox CBox::operator+(const CBox& aBox) const
  22. {
  23.   // New object has larger length and width of the two,
  24.   // and sum of the two heights
  25.   return CBox(m_Length > aBox.m_Length ? m_Length : aBox.m_Length,
  26.               m_Width > aBox.m_Width ? m_Width : aBox.m_Width,
  27.               m_Height + aBox.m_Height);
  28. }
  29.  
  30. // Multiply a box by an integer
  31. CBox CBox::operator*(int n) const
  32. {
  33.   if(n%2)
  34.     return CBox(m_Length, m_Width, n*m_Height);           // n odd
  35.   else
  36.     return CBox(m_Length, 2.0*m_Width, (n/2)*m_Height);   // n even
  37. }
  38.  
  39. // Divide one box into another
  40. int CBox::operator/(const CBox& aBox) const
  41. {
  42.   // Temporary for number in horizontal plane this way
  43.   int tc1 = 0;
  44.   // Temporary for number in a plane that way
  45.   int tc2 = 0;
  46.  
  47.   tc1 = static_cast<int>((m_Length/aBox.m_Length))*
  48.          static_cast<int>((m_Width/aBox.m_Width));   // to fit this way
  49.  
  50.   tc2 = static_cast<int>((m_Length/aBox.m_Width))*
  51.         static_cast<int>((m_Width/aBox.m_Length));   // and that way
  52.  
  53.   //Return best fit
  54.   return static_cast<int>((m_Height/aBox.m_Height))*(tc1>tc2 ? tc1 : tc2);
  55. }
  56.  

El fichero de cabecera lo entiendo, es como "construir" la clase. Pero a la hora de implementarla en el fichero cpp, no entiendo como se "inventa" ( para mi claro) ciertas cosas. Por ejemplo ( uno de tantos..) en el fichero .h esta esto :
Código: C++
  1. public:
  2.   double GetWidth(void)
  3.   {
  4.     return m_Width;
  5.  
y digo yo, en el archivo . cpp vere su implementación... pues no no la veo..pero por ejemplo veo que implementa cosas que no están en el archivo de cabecera, tales como :
Código: C++
  1. // Divide one box into another
  2. int CBox::operator/(const CBox& aBox) const
  3. {
  4.   // Temporary for number in horizontal plane this way
  5.   int tc1 = 0;
  6.   // Temporary for number in a plane that way
  7.   int tc2 = 0;
  8.  
  9.   tc1 = static_cast<int>((m_Length/aBox.m_Length))*
  10.          static_cast<int>((m_Width/aBox.m_Width));   // to fit this way
  11.  
  12.   tc2 = static_cast<int>((m_Length/aBox.m_Width))*
  13.         static_cast<int>((m_Width/aBox.m_Length));   // and that way
  14.  
  15.   //Return best fit
  16.   return static_cast<int>((m_Height/aBox.m_Height))*(tc1>tc2 ? tc1 : tc2);
  17. }
  18.  
Eso entendería mucho mejor que se hiciese en el main() de cualquier programa, el hecho que se haga aquí me tiene totalmente perdido...