Foros del Web » Programación para mayores de 30 ;) » C/C++ »

[SOLUCIONADO] Problema - No encuentro solucion - Separar interfaz de la implementacion - Deitel

Estas en el tema de Problema - No encuentro solucion - Separar interfaz de la implementacion - Deitel en el foro de C/C++ en Foros del Web. Buenas. Soy nuevo en esto de la programacion, ya intente buscar soluciones en otros lados, pero las respuestas son muy muy tecnicas o muy vagas. ...
  #1 (permalink)  
Antiguo 06/08/2015, 23:33
 
Fecha de Ingreso: agosto-2015
Mensajes: 10
Antigüedad: 8 años, 8 meses
Puntos: 0
Pregunta Problema - No encuentro solucion - Separar interfaz de la implementacion - Deitel

Buenas.
Soy nuevo en esto de la programacion, ya intente buscar soluciones en otros lados, pero las respuestas son muy muy tecnicas o muy vagas.
quisiera saber si alguien podria compartir algo de su conocimiento con migo.
Estuve leyendo en otros foros y aqui mismo incluso pero las unicas respuestas que encontre fueron crear main , crear winmain o usar windows.h y otras que se metian con los ajustes del compilador pero ninguna funciono.

Para darles un ejemplo de las respuestas que encontre :
http://www.forosdelweb.com/f96/problema-con-definir-las-funciones-miembro-clase-cpp-separado-966134/
Vaya respuesta, no creen?


Tengo tiempo leyendo el libro de dietel "c++11 como programar" y estoy atorado en un tema del libro , para se exacto el capitulo 3 , tema 3.7 (si, lose... que novato.).
El problema se me da a la hora de compilar la clase LibroCalificaciones.

Uso Code::blocks y Dev C++ con MinGW (dudo que cambiando de IDE se solucione algo, pero bueno... ustedes son los expertos), y en ambos me aparece el mismo error "Undefined reference to WinMain@16".
(En gnu/linux ubuntu con g++ si puedo compilar la clase, solo la clase, pero de momento me quiero centrar en windows.)

Si intento compilar el codigo cliente (main) me paracesen estos errores,

undefined reference to `LibroCalificaciones::LibroCalificaciones(std::str ing)'
undefined reference to `LibroCalificaciones::LibroCalificaciones(std::str ing)'
undefined reference to `LibroCalificaciones::obtenerNombreCurso()'
undefined reference to `LibroCalificaciones::obtenerNombreCurso()'

Este es mi codigo.

LibroCalificaciones.h
Código:
class LibroCalificaciones
{
public:
    explicit LibroCalificaciones (std::string); nombreCurso
    void establecerNombreCurso (std::string); 
    std::string obtenerNombreCurso() const; 
    void mostrarMensaje() const;
private:
    std::string nombreCurso; 
};

LibroCalificaciones.cpp
Código:
#include<iostream>
#include"LibroCalificaciones.h" 


LibroCalificaciones::LibroCalificaciones(string nombre)
: nombreCurso (nombre)
{
    
} 

void LibroCalificaciones::establecerNombreCurso(string nombre)
{
    nombreCurso = nombre;

string LibroCalificaciones::obtenerNombreCurso() const
{
    return nombreCurso;
}

void LibroCalificaciones::mostrarMensaje() const
{
    cout<<"Bienvenido al libro de calificaciones para :\n" <<obtenerNombreCurso()
    <<"!" <<endl;
}
main LibroCalificaciones.cpp
Código:
#include<iostream>
#include"LibroCalificaciones.h" 
using namespace std;

int main ()
{
    LibroCalificaciones libroCalificaciones1 ("CS101 introduccion a la programacion   
    en C++");
    LibroCalificaciones libroCalificaciones2 ("CS102 estructura de datos en C++");

    cout<<"LibroCalificaciones1 creado para el curso : " 
   <<libroCalificaciones1.obtenerNombreCurso()
   <<"\nLibroCalificaciones2 creado para el curso : " 
   <<libroCalificaciones2.obtenerNombreCurso()
   <<endl;
}

Última edición por godeffuffeff; 07/08/2015 a las 01:42
  #2 (permalink)  
Antiguo 07/08/2015, 02:43
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

Yo creo que los problemas los tienes porque en el archivo LibroCalificaciones.cpp no estas definiendo string dentro de std

Aparte hay algún problema de llaves sin cerrar y otra que creo que se debe al copia/pega.

Al igual que en el archivo *.h has definido los tipos dentro de su namespace, es decir, el tipo o clase string pertenece al namespace std, igual has de hacerlo en el archivo cpp

LibrosCalificaciones.cpp

Código C++:
Ver original
  1. #include <iostream>
  2. #include "LibroCalificaciones.h"
  3.  
  4.  
  5. LibroCalificaciones::LibroCalificaciones(std::string nombre)
  6. : nombreCurso (nombre)
  7. {
  8.    
  9. }
  10.  
  11. void LibroCalificaciones::establecerNombreCurso(std::string nombre)
  12. {
  13.     nombreCurso = nombre;
  14. }
  15.  
  16. std::string LibroCalificaciones::obtenerNombreCurso() const
  17. {
  18.     return nombreCurso;
  19. }
  20.  
  21. void LibroCalificaciones::mostrarMensaje() const
  22. {
  23.     std::cout<<"Bienvenido al libro de calificaciones para :\n" << obtenerNombreCurso() << "!" << std::endl;
  24. }

Y en el main:

Código C++:
Ver original
  1. #include <iostream>
  2. #include "LibroCalificaciones.h"
  3.  
  4. using namespace std;
  5.  
  6. int main ()
  7. {
  8.     LibroCalificaciones libroCalificaciones1 ("CS101 introduccion a la programacion en C++");
  9.     LibroCalificaciones libroCalificaciones2 ("CS102 estructura de datos en C++");
  10.  
  11.     cout<<"LibroCalificaciones1 creado para el curso : " <<libroCalificaciones1.obtenerNombreCurso() <<"\nLibroCalificaciones2 creado para el curso : "
  12.    <<libroCalificaciones2.obtenerNombreCurso() <<endl;
  13. }
__________________
Mi calculadora en Qt
  #3 (permalink)  
Antiguo 07/08/2015, 04:46
 
Fecha de Ingreso: agosto-2015
Mensajes: 10
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

Gracias , no habia notado lo del std, pero eso no soluciono el problema.

Este es el error del que hablo, sucede al compilar LibroCalificaciones,
http://sia1.subirimagenes.net/img/2015/08/07/150807124652320067.png

y este otro sale al compilar main,
http://sia1.subirimagenes.net/img/2015/08/07/150807124652792647.png
  #4 (permalink)  
Antiguo 07/08/2015, 05:02
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

Como dijo dehm, te falta incluir iostring o string en todos los ficheros que declares un string.

Un string no es un tipo de datos básico corriente como lo es char o int, si no que es una clase. Al igual que haces el include de "LibroCalificaciones.h" el el archivo "LibroCalificaciones.cpp" debes hacer el include de iostream o string en todos los ficheros donde declares un std::string, si usas std::cin, std::cout, std::endl etc, entonces es iosting. =)

El problema que si sales a lo loco haciendo includes de iostream o cualquier otro fichero en todos los lados repetidas veces vas a tener problemas de doble inclusión(problemas por incluir 2 o más veces el mismo archivo), sobre todo en los *.h, por lo que vas a tener que usar el sistema de guard. Vea este vídeo para entender el problema: https://www.youtube.com/watch?v=N3yLYgUR-UI

Última edición por vangodp; 07/08/2015 a las 05:09
  #5 (permalink)  
Antiguo 07/08/2015, 05:23
 
Fecha de Ingreso: agosto-2015
Mensajes: 10
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

De acuerdo, ya lo corregi, pero winmain y los otros 4 errores siguen apareciendo, segun el libro tengo que unir el codigo objeto con el codigo cliente , alguien me explica como hago eso, o cual es el origen de los errores anteriores tomando en cuenta que ya corregi el codigo?
  #6 (permalink)  
Antiguo 07/08/2015, 05:36
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

¿Que tipo de proyecto estas creando? Creas un proyecto de consola no?
para que te funcione ese programa debes crear un nuevo proyecto, y elejir console aplication o algo parecido, tiene que ser una aplicación de consola, si te sale un archivo main con algo de código lo sustituyes por el que tiene tu main.cpp, y luego vas creando los demás archivos y además debes ir incluyéndolos en el proyecto. luego pulsas en la rueda para compilar y en el triangulo para ejecutar, no tienes que hacer nada más, el IDE hace todo por ti.

Si quieres te paso un proyecto completo para que veas

Última edición por vangodp; 07/08/2015 a las 05:42
  #7 (permalink)  
Antiguo 07/08/2015, 05:59
 
Fecha de Ingreso: septiembre-2010
Mensajes: 494
Antigüedad: 13 años, 7 meses
Puntos: 10
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

Intenta compilarlo a mano desde la consola, así vemos si el problema es que tienes mal configurado el proyecto en CodeBlocks.

Si tienes todos los archivos junto en el mismo directorio, te sitúas ahí y ejecuta:

g++ -o miapp LibroCalificaciones.cpp main.cpp

Te debería crear un ejecutable llamado "mapp"

Edito:

Si sólo quieres compilar la clase (sólo crearás un código objeto listo para ser usado para crear ejecutables, pero que no es un ejecutable en sí mismo), haz esto:

g++ -c LibroCalificaciones.cpp -o LibroCalificaciones.o
__________________
Mi calculadora en Qt
  #8 (permalink)  
Antiguo 07/08/2015, 13:00
 
Fecha de Ingreso: agosto-2015
Mensajes: 10
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

Gracias vangodp y dehm por sus respuestas.
hice un proyecto para consola eso soluciono el problema del winmain y los otros cuatro errores,
pero a la hora de compilar me aparece un !Hola Mundo!, por que sucede eso?
http://k46.kn3.net/B8268A5E7.png

y si, porfavor pasame un proyecto con instrucciones completas para ver cual seria el resultado final y darme una idea del proceso de compilacion y union, si puede ser uno sencillo lo agradeceria, como dije, soy nuevo, seria bueno que se pareciera a lo que yo estoy aciendo, crear una clase con interfaz y codigo separada para despues unir el codifo objeto (eso dice el libro, y lo confirma dehm) con el codigo cliente (main).

dehm,
intente compilarlo desde la consola pero no funciona, me dice "g++ no se reconoce como un comando interno o externo, programa o archivo por lotes ejecutables"
http://k33.kn3.net/5C8371554.png

Despues de indagar un poco di con la respuesta de que era necesario instalar MinGW aparte en el sistema, solo como compilador, lo hice e instale el paquete "minwg 32 g++", pero el resultado sigue siendo el mismo.

Agradeceria tu asesoria.

Gracias a ambos, me estan ayudando bastante.

Última edición por godeffuffeff; 07/08/2015 a las 13:15
  #9 (permalink)  
Antiguo 07/08/2015, 13:20
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

Cuandos creas el proyecto en Code::Blocks automáticamente crea un main.cpp para el proyecto pon el código de tu "main" en el archivo llamado main.cpp lo encontras en el manager de la izquierda, en el apartado de proyecto. Si no ves ese menú de la izquierda presiona Shift + F2.

Saludos y suerte.
  #10 (permalink)  
Antiguo 07/08/2015, 14:12
 
Fecha de Ingreso: agosto-2015
Mensajes: 10
Antigüedad: 8 años, 8 meses
Puntos: 0
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

Gracias por responder xKuZz.
en cuanto al winmain todo esta bien ya no da problemas, como dijo vangodp, necesitaba crear un proyecto, y como tu dijiste sustitui el codigo por defecto de main en el proyecto de codeblocks, lo cual ayudo, pero me sigue dando este error,

undefined reference to `LibroCalificaciones::LibroCalificaciones(std::str ing)'
undefined reference to `LibroCalificaciones::LibroCalificaciones(std::str ing)'
undefined reference to `LibroCalificaciones::obtenerNombreCurso()'
undefined reference to `LibroCalificaciones::obtenerNombreCurso()'

mira, este es el codigo que actualmente uso, segun ya esta corregido, lo voy a pasar tal cual, con comentarios y todo.

Si logras correrlo, porfavor explicame que pasos seguiste, porque no encuentro informacion que sea capaz de comprender por ningun lado, en especial me interesa saber como implementar el codigo objeto de LibroCalificaciones.h a el codigo cliente (main).

LibroCalificaciones.h
Código C++:
Ver original
  1. #include<string> //La clase LibroCalificaciones utiliza la clase string estandar de c++
  2.  
  3. //Definicion de la clase LibroCalificaciones
  4. class LibroCalificaciones
  5. {
  6. public:
  7.     explicit LibroCalificaciones (std::string); //Contructor que inicializa a nombreCurso
  8.     void establecerNombreCurso (std::string); //Establecer el nombre del curso
  9.     std::string obtenerNombreCurso() const; //Obtiene el nombre del curso
  10.     void mostrarMensaje() const;//Muestra un mensaje de bienvenida
  11.     private:
  12.     std::string nombreCurso; //Nombre del curso para este LibroCalificaciones
  13. }; //Fin de la clase LibroCalificaciones

LibroCalificaciones.cpp
Código C++:
Ver original
  1. #include<iostream>
  2. #include"LibroCalificaciones.h" //Incluye la definicion de la clase LibroCalificaciones
  3. using namespace std;
  4.  
  5. //El constructor inicializa a nombreCurso con el objeto string suministrado como argumento
  6. LibroCalificaciones::LibroCalificaciones(string nombre)
  7. : nombreCurso (nombre) //Inicializador de miembros para inicializar nombreCurso
  8. {
  9.     //Cuerpo vacio
  10. } //Fin del constructor de LibroCalificaciones
  11.  
  12. //Funcion para establecer el nombreCurso del objeto
  13. void LibroCalificaciones::establecerNombreCurso(string nombre)
  14. {
  15.     nombreCurso = nombre; //Almacena el nombre del curso en el objeto
  16. }//Funncion de la funcion establecerNombreCurso
  17.  
  18. //Funcion para obtener el nombre del curso
  19. string LibroCalificaciones::obtenerNombreCurso() const
  20. {
  21.     return nombreCurso; //Devuelve el nombre del objeto
  22. } //Fin de la funcion obtenerNombreCurso
  23.  
  24. //Muestra un mensaje de bienvenida al usuario de LibroCalificaciones
  25. void LibroCalificaciones::mostrarMensaje() const
  26. {
  27.     //Llama a obtenerNombreCurso para obtener el nombreCurso
  28.     cout<<"Bienvenido al libro de calificaciones para :\n" <<obtenerNombreCurso()
  29.     <<"!" <<endl;
  30. } //Fin de la funcion mostrarMensaje

main
Código C++:
Ver original
  1. #include<iostream>
  2. #include"LibroCalificaciones.h" //Incluye la definicion de la clase LibroCalificaciones
  3. using namespace std;
  4.  
  5. //La funcion main enpieza la ejecucuin del programa
  6. int main ()
  7. {
  8.     //Crea un objeto LibroCalificaciones
  9.     LibroCalificaciones libroCalificaciones1 ("CS101 introduccion a la programacion en C++");
  10.     LibroCalificaciones libroCalificaciones2 ("CS102 estructura de datos en C++");
  11.  
  12.     //Muestra el valor inicial de nombreCurso para cada LibroCalificaciones
  13.     cout<<"LibroCalificaciones1 creado para el curso : " <<libroCalificaciones1.obtenerNombreCurso()
  14.         <<"\nLibroCalificaciones2 creado para el curso : " <<libroCalificaciones2.obtenerNombreCurso()
  15.         <<endl;
  16. } //Fin de la funcion main
  #11 (permalink)  
Antiguo 07/08/2015, 14:41
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

No entiendo yo lo compilo y me funciona como es debido, pon una foto de tu proyecto (parte de la izquierda) mira el mío. Asegurate de haber añadido cada archivo al proyecto. Si no los has añadido métete en Project->Add files y mételos para asegurarte de que cuando compilas se guardan y actualizan dichos archivos. Mira el mío con foto.



Te dejo el proyecto a ver si puedes averigüar qué falla (No he hecho nada diferente de lo que has puesto en el último post, sólo copiar y pegar).

https://mega.co.nz/#!cd9HWBTZ!0X0iao...zTi3k8M75hh6Dk

Además te comento que es una mala práctica utilizar std::string sin hacer #include <string>, si bien es cierto que para la mayoría de compiladores actuales incluir iostream pasa string no es algo que se deba hacer.

Saludos y espero haberte ayudado.

Última edición por xKuZz; 07/08/2015 a las 14:49
  #12 (permalink)  
Antiguo 07/08/2015, 16:42
 
Fecha de Ingreso: agosto-2015
Mensajes: 10
Antigüedad: 8 años, 8 meses
Puntos: 0
De acuerdo Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

... Gracias.

Conque ese era el problema...
De verdad GRACIAS.

Tan simple era la solucion, me sorprende no averla encontrado.

Solo tengo una pregunta mas.

¿Este foro tiene algun sistema de puntos o algo, puedo votarte positivo, a ti y a los que ayudaron?
  #13 (permalink)  
Antiguo 07/08/2015, 18:03
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Problema - No encuentro solucion - Separar interfaz de la implementacion -

No te preocupes por puntos. Aquí lo único que hay que preocuparse es si el problema se soluciono, y por lo que veo ya lo tienes resuelto. ;)

Suerte ;)

Etiquetas: c++, implementacion, interfaz, libro, manual, solucion
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:17.