[Linker error] undefined reference to `LibroCalificaciones::LibroCalificaciones(std::string)' [Linker error] undefined reference to `LibroCalificaciones::LibroCalificaciones(std::string)' [Linker error] undefined reference to `LibroCalificaciones::obtenerNombreCurso()' [Linker error] undefined reference to `LibroCalificaciones::obtenerNombreCurso()' [Linker error] undefined reference to `LibroCalificaciones::establecerNombreCurso(std::string)' [Linker error] undefined reference to `LibroCalificaciones::obtenerNombreCurso()' [Linker error] undefined reference to `LibroCalificaciones::obtenerNombreCurso()' ld returned 1 exit status
Aqui estan los ficheros de codigo fuente: main.cpp
Spoiler:
#include <iostream> using namespace std;
#include "LibroCalificaciones.h"
int main() { //Crea dos objetos LibroCalificaciones LibroCalificaciones libroCalificaciones1 ("CS101 Introducción a la programación en C++" ); LibroCalificaciones libroCalificaciones2 ("CS102 C++: Estruc de datos" );
//muestra el nombreCurso de cada LibroCalificaiones cout << "El nombre inicial del curso de LibroCalificaiones1 es: " << libroCalificaciones1.obtenerNombreCurso() << "\nEl nombre inicial del curso de libroCalificaionnes2 es: " << libroCalificaciones2.obtenerNombreCurso() << endl;
//Modifica el nombreCurso de libroCalificaiones1 (con una cadena con longitud valida) libroCalificaciones1.establecerNombreCurso ("CS101 Prtrogramación en C++" );
//Muestra el nombreCurso de cada LibroClificaciones cout << "\nel nombre del curso de libroCalificaciones1 es: " << libroCalificaciones1.obtenerNombreCurso() << "\nel nombre del curso para libroCalifiaciones2 es: " << libroCalificaciones2.obtenerNombreCurso() << endl;
return 0;//Indica que termono correctamente
system("PAUSE"); }//Fin de main()
LibroCalificaciones.cpp
Spoiler:
#include <iostream>
using namespace std;
#include "LibroCalificaciones.h"
//El constructor inicializa a nombreCurso con la cadena que se suministra como argumento LibroCalificaciones::LibroCalificaciones( string nombre ) { establecerNombreCurso( nombre );//Valida y almacena a nombreCurso }//Fin del constructor de LibroCalificaciones
//Funcion que establece el nombre del curso y asegura que el nombre del curso tenga como máximo 25 caracteres void LibroCalificaciones::establecerNombreCurso( string nombre ) { if (nombre.length() <= 25 )//Si nombre tiene 25 caracteres o menos nombreCurso = nombre;//almacena el nombre del curso en el objeto
if (nombre.length() > 25 )//Si nombre tine más de 25 caracteres { //EStablece nombreCurso a los primeros 25 caracteres del parametro nombre nombreCurso = nombre.substr( 0 ,25 );//empieza en 0, longitud de 25
cout << "El nombre \"" << nombre << "\" exede la longitud maxmima (25).\n" << "Se limito nombreCurso a los primeros 25 caracteres.\n" << endl; }//Fin de if }//Fin de la funcion establecer nombreCurso
//Funcion para obtener el nombre del curso string LibroCalificaciones::obtenerNombreCurso() { return nombreCurso;//Devuelve el nombreCurso del objeto }//Fin de la funcion obtenerNombreCurso
//Muestra un mensaje de bienvenida al usuario de LibroCalifiaciones void LibroCalificaciones::mostrarMensaje() { //Llama a obtener nombreCurso para obtener el nombreCurso cout << "Bienvenido al libro de calificaiones para\n" << obtenerNombreCurso() << "!" << endl; }//Fin de la funcion mostrarMensaje
LibroCalificaciones.h
Spoiler:
#include <string> using namespace std;
class LibroCalificaciones { public: LibroCalificaciones(string);//Constructor que inicializa un objeto LibroCalificaciones void establecerNombreCurso(string);//Funcion que establece el nombre del curso string obtenerNombreCurso();//Funcion que obtiene el nombre del curso void mostrarMensaje();//Funcion que muestra un mensaje de bienvenida private: string nombreCurso;//Nombre del curso para este LibroCalificaiones };//Fin de la clase LibroCalificaciones
Espero y me puedan ayudar a saber por que no puede enlazar el compilador.
El compilador no enlaza (¿para qué usar "link" cuando tienes en castellano una palabra para ello? ), es el enlazador el que lo hace (linker, generalmente ld en Linux).
Si vas a dividir tu proyecto en varios ficheros, necesitarás compilar cada uno por separado y generar los .o correspondientes a cada uno. Luego pasarle estos .o al enlazador. Por ejemplo:
o.0 Asi esta mas claro! . EDIT: Pero cuando incluyo con una directiva "#Include"el fichero "LibroCalificaciones.cpp" al codigo cliente(función "main") ahora si compila(omitiendo por completo el fichero .h).
Primero, los fichero .cpp no se incluyen por convenio. Eso se hace como te he comentado antes. Segundo, obvio que no necesitas el .h porque seguramente ya esta incluído en el .cpp.
Según el autor debería de compilarse tal cual (el se basa en Visual C++) así que voy a probar instalando Visual y compilarlo(si aún así no se compila entonces el autor esta safado ). Aunque ya lo compile en g++.