Título: Problema con separar interfaz de implementación de una clase. Publicado por: reethok en 25 Diciembre 2011, 11:54 am Verán, estoy estudiando C++ en el libro "C++ Cómo Programar de Deitel", y me dice que cuando creo una archivo de encabezado (.h) con una clase es recomendable definir las funciones miembro de la clase en un archivo de código fuente separado. Entonces, quedo con 3 archivos, así:
LibroCalificaciones.h Código: #include <string> LibroCalificaciones.cpp Código: #include <iostream> Y por último, el programa cliente de la clase, Programa.cpp (soy bien creativo). Código: #include <iostream> Bueno, ahora mi problema es que el libro me dice que debo compilar primero LibroCalificaciones.cpp, para así obtener el código objeto y blablabla, (NOTA, uso code::blocks con MinGW) pero al darle en compilar, me marca error. "Undefined reference to 'WinMain@16'. Si trato de compilar "Programa.cpp", me salen los siguientes errores: C:\Users\Nikolov\Desktop\CPP\Programa.o:Programa.c pp|| undefined reference to `LibroCalificaciones::LibroCalificaciones(std::str ing)'| C:\Users\Nikolov\Desktop\CPP\Programa.o:Programa.c pp|| undefined reference to `LibroCalificaciones::LibroCalificaciones(std::str ing)'| C:\Users\Nikolov\Desktop\CPP\Programa.o:Programa.c pp|| undefined reference to `LibroCalificaciones::obtenerNombreCurso()'| C:\Users\Nikolov\Desktop\CPP\Programa.o:Programa.c pp|| undefined reference to `LibroCalificaciones::obtenerNombreCurso()'| ||=== Build finished: 4 errors, 0 warnings ===| Y bueno, la única forma de "armar el programa" que he encontrado es crear un proyecto en code::blocks, meterle los 3 archivos y darle en "Build", y así sí funciona, pero no entiendo por qué. ¿Alguien me explica? Y cómo le hago para hacer lo que me pide el libro, que es "ocultar la forma en que funcionan los funciones miembro al programador cliente de la clase"... osease que compilar LibroCalificaciones.cpp, y darlo ya compilado junto con LibroCalificaciones.h y así arrancar el programa en Programa.cpp? Saludos, espero me ayuden =/ Título: Re: Problema con separar interfaz de implementación de una clase. Publicado por: Eternal Idol en 25 Diciembre 2011, 12:20 pm No estas compilando solamente, tambien estas enlazando, por eso te dice que para el archivo objeto (.o) no puede resolver un simbolo en particular. La unica forma de lograr compilar y enlazar eso es justamente haciendolo con los dos archivos .cpp en el mismo momento (Programa necesita la implementacion de la clase y LibroCalificaciones no tiene punto de entrada - main -).
Desde linea de comandos tambien deberia funcionarte: g++ Programa.cpp LibroCalificaciones.cpp. Título: Re: Problema con separar interfaz de implementación de una clase. Publicado por: reethok en 25 Diciembre 2011, 12:52 pm Entonces cómo hago lo que me pide el libro?
Dice que NO DEBO proporcionar el codigo fuente de LibroCalificaciones.cpp, sólamente el código objeto. Título: Re: Problema con separar interfaz de implementación de una clase. Publicado por: Eternal Idol en 25 Diciembre 2011, 13:17 pm g++ -c LibroCalificaciones.cpp
g++ Programa.cpp LibroCalificaciones.o Título: Re: Problema con separar interfaz de implementación de una clase. Publicado por: reethok en 25 Diciembre 2011, 13:31 pm Uso MinGW... IDE code::blocks y Windows 7... no entiendo. xD
Título: Re: Problema con separar interfaz de implementación de una clase. Publicado por: Eternal Idol en 25 Diciembre 2011, 13:45 pm Por lo que veo la opcion de "Compile current file" de Code::Blocks tambien enlaza ... que bazofia ... tal vez haya alguna manera de configurarlo para que haga lo que se supone dice hacer el menu pero no la conozco ni quiero aprender un IDE que nunca voy a usar.
En %Program Files%\CodeBlocks\MinGW\bin tenes el ejecutable g++, usalo desde CMD como te muestro arriba (pone los paths en los archivos al llamarlo o usa set path y llamalo desde el directorio de los archivos). Título: Re: Problema con separar interfaz de implementación de una clase. Publicado por: 3mp3z@ndo en 25 Diciembre 2011, 14:43 pm Para cumplir lo que te pide el ejercicio del libro, haz lo siguiente:
Primero: Código: g++ -c LibroCalificaciones.cpp Segundo: Código: g++ -c Programa.cpp Y por ultimo: Código: g++ -o Programa LibroCalificaciones.o Programa.o Un saludo. |