Jueves 14 de Noviembre de 2024, 16:49
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
clases en diferentes ficheros y stdafx.h
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: clases en diferentes ficheros y stdafx.h (Leído 4589 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++
// Punto.h
#ifndef PuntoH
#define PuntoH
class
Punto
{
private
double
x,y
;
public
:
Punto
(
)
:
Punto
(
double
a,
double
b
)
;
~Punto
(
)
;
}
;
#endif
y el archivo *cpp
Código: C++
#include "Punto.h"
Punto
::
Punto
(
)
{
x
=
y
=
0
;
}
Punto
::
~Punto
(
)
{
}
y el main()
Código: C++
// main_clases.cpp : main project file.
//#include "stdafx.h"
#include <iostream>
using
namespace
System
;
using
namespace
std
;
int
main
(
array
<
System
::
String
^
>
^
args
)
{
Console
::
WriteLine
(
L
"Hello World"
)
;
return
0
;
}
Al compilar me salen estos errores y warnings:
Código: C++
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
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
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
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
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 )
Tweet
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
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++
//clase.h
class
clase
{
}
public
:
int
una
;
int
funcion
(
int
a
)
;
;
y la implementacion(que seia por parte de cada programador según como querría gestionar la clase?):
Código: C++
#include "clase.h"
clase
::
funcion
(
int
a
)
{
// dónde pongo la variable que devuelve la función?
a
=
2
*
a
;
return
a
;
}
}
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++
#pragma once
class
CBox
{
public
:
CBox
(
double
lv
=
1.0
,
double
wv
=
1.0
,
double
hv
=
1.0
)
;
public
:
public
:
~CBox
(
void
)
;
private
:
// Length of a box in inches
double
m_Length
;
// Width of a box in inches
double
m_Width
;
// Height of a box in inches
double
m_Height
;
public
:
double
GetHeight
(
void
)
{
return
m_Height
;
}
public
:
double
GetWidth
(
void
)
{
return
m_Width
;
}
public
:
double
GetLength
(
void
)
{
return
m_Length
;
}
public
:
double
Volume
(
void
)
const
{
return
m_Length
*
m_Width
*
m_Height
;
}
public
:
// Overloaded addition operator
CBox operator
+
(
const
CBox
&
aBox
)
const
;
public
:
// Multiply a box by an integer
CBox operator
*
(
int
n
)
const
;
public
:
// Divide one box into another
int
operator
/
(
const
CBox
&
aBox
)
const
;
}
;
fichero .cpp
Código: C++
#include "Box.h"
CBox
::
CBox
(
double
lv,
double
wv,
double
hv
)
:
m_Length
(
0
)
{
lv
=
lv
<=
0.0
?
1.0
:
lv
;
// Ensure positive
wv
=
wv
<=
0.0
?
1.0
:
wv
;
// dimensions for
hv
=
hv
<=
0.0
?
1.0
:
hv
;
// the object
m_Length
=
lv
>
wv
?
lv
:
wv
;
// Ensure that
m_Width
=
wv
<
lv
?
wv
:
lv
;
// length >= width
m_Height
=
hv
;
}
CBox
::
~CBox
(
void
)
{
}
// Overloaded addition operator
CBox CBox
::
operator
+
(
const
CBox
&
aBox
)
const
{
// New object has larger length and width of the two,
// and sum of the two heights
return
CBox
(
m_Length
>
aBox.
m_Length
?
m_Length
:
aBox.
m_Length
,
m_Width
>
aBox.
m_Width
?
m_Width
:
aBox.
m_Width
,
m_Height
+
aBox.
m_Height
)
;
}
// Multiply a box by an integer
CBox CBox
::
operator
*
(
int
n
)
const
{
if
(
n
%
2
)
return
CBox
(
m_Length, m_Width, n
*
m_Height
)
;
// n odd
else
return
CBox
(
m_Length,
2.0
*
m_Width,
(
n
/
2
)
*
m_Height
)
;
// n even
}
// Divide one box into another
int
CBox
::
operator
/
(
const
CBox
&
aBox
)
const
{
// Temporary for number in horizontal plane this way
int
tc1
=
0
;
// Temporary for number in a plane that way
int
tc2
=
0
;
tc1
=
static_cast
<
int
>
(
(
m_Length
/
aBox.
m_Length
)
)
*
static_cast
<
int
>
(
(
m_Width
/
aBox.
m_Width
)
)
;
// to fit this way
tc2
=
static_cast
<
int
>
(
(
m_Length
/
aBox.
m_Width
)
)
*
static_cast
<
int
>
(
(
m_Width
/
aBox.
m_Length
)
)
;
// and that way
//Return best fit
return
static_cast
<
int
>
(
(
m_Height
/
aBox.
m_Height
)
)
*
(
tc1
>
tc2
?
tc1
:
tc2
)
;
}
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++
public
:
double
GetWidth
(
void
)
{
return
m_Width
;
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++
// Divide one box into another
int
CBox
::
operator
/
(
const
CBox
&
aBox
)
const
{
// Temporary for number in horizontal plane this way
int
tc1
=
0
;
// Temporary for number in a plane that way
int
tc2
=
0
;
tc1
=
static_cast
<
int
>
(
(
m_Length
/
aBox.
m_Length
)
)
*
static_cast
<
int
>
(
(
m_Width
/
aBox.
m_Width
)
)
;
// to fit this way
tc2
=
static_cast
<
int
>
(
(
m_Length
/
aBox.
m_Width
)
)
*
static_cast
<
int
>
(
(
m_Width
/
aBox.
m_Length
)
)
;
// and that way
//Return best fit
return
static_cast
<
int
>
(
(
m_Height
/
aBox.
m_Height
)
)
*
(
tc1
>
tc2
?
tc1
:
tc2
)
;
}
Eso entendería mucho mejor que se hiciese en el main() de cualquier programa, el hecho que se haga aquí me tiene totalmente perdido...
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
clases en diferentes ficheros y stdafx.h