separar la interfaz de la implementacion [Solucionado]
Publicado: 19 Junio, 2010 - 02:50 separar la interfaz de la implementacion [Solucionado]
hola. estoy estudiando c++ del libro "como programar en c++" de deitel y pues en el capitulo 3 habla sobre la clases, y toca el tema de separar la interfaz de la implementación, el cuento es que hice un programa y separe la interfaz de la implementación a manera de practica pero en el codeblocks me sale: undefine reference to...
creo que tengo todo bien. tengo un archivo .h con la clase y los prototipos de la funciones, dicho archivo lo incluyo en otro con el mismo nombre pero .cpp donde defino las funciones y también lo incluyo en el programa ejemplo, no se que estoy haciendo mal..
ayudenme por favor, si necesitan que ponga el código me avisan.
gracias
- Inicie sesión o regístrese para enviar comentarios
- 1396 lecturas


Si no entendí mal, tenes un .h y un .cpp para la interfaz.
Ahí está el error. La interfaz sólo lleva un .h en el que todas las operaciones son virtual pura, o sea, se declaran como
virtual operacion(tipo1 param1, ..., tipon paramn) = 0;Como esas operaciones son abstractas, los correspondientes métodos estarán en las clases que realicen la interfaz.
No sé si me expliqué bien. Cualquier duda, preguntá.
Saludos.
hola javmarta. tengo un .h con la definicion de la clase pero solo con los prototipos de las funciones (aun sin definirlas) y tengo un .cpp con el mismo nombre que es donde las defino claro esta incluyendo el .h y usando el operador :: para definir las funciones miembro. pues asi es como me lo muestran en el libro no se si me equivoque...
gracias
Lo que estás haciendo ahí, es separar la definición de las operaciones de la clase (en un .h) de su implementación (en un .cpp). No una interfaz.
El error que te da es porque posiblemente en el programa principal estés usando una operación a la que no le diste método en el .cpp
hola javmarta. pues no te entiendo muy bien voy a colocar el codigo aver que me dices. otra cosa, el libro trae un cd y en el cd esta el ejemplo que da el libro de separar la interfaz de la implementación, sin embargo este tampoco lo compila no se que pasa. sera que no estoy usando bien el code blocks?
el .h:
//clase Empleado.h#include <iostream>
#include<string>
using namespace std;
class Empleado {
private:
string nombre;
string apellido;
int salario;
public:
Empleado(string name, string lastname, int pago);
void establecerNombre(string n);
void establecerApellido(string ln);
void establecerSalario(int s);
string obtenerNombre();
string obtenerApellido();
int obtenerSalario();
};
el cpp que define las funciones:
//Empleado.cpp#include "Empleado.h"
Empleado::Empleado(string name, string lastname, int pago){
establecerNombre(name);
establecerApellido(lastname);
establecerSalario(pago);
}
void Empleado::establecerNombre(string n){
nombre=n;
}
void Empleado::establecerApellido(string ln){
apellido=ln;
}
void Empleado::establecerSalario(int s){
if (pago<0){
salario=0;
}
else {
salario=s;
}
}
string obtenerApellido(){
return apellido;
}
string obtenerNombre(){
return nombre;
}
int obtenerSalario()
{
return salario;
}
y el programa que prueba la clase:
//programa practica2.cpp#include "Empleado.h"
int main ()
{
string nom;
string ape;
int sal;
cout<<" \t programa Empleado \n \n \n";
cout<<" \t empleado 1 \n \n";
cout<<"escriba su nombre: ";
cin>>nom;
cout<<"\n escriba su apellido: ";
cin>>ape;
cout<<"\n ingrese su salario: ";
cin>>sal;
Empleado empleado1(nom,ape,sal);
cout<<" \t empelado 2 \n \n";
cout<<"escriba su nombre: ";
cin>>nom;
cout<<"\n escriba su apellido: ";
cin>>ape;
cout<<"\n ingrese su salario: ";
cin>>sal;
Empleado empleado2 (nom,ape,sal);
cout<<"\t saludos empleado 1 su informacion y su salario anual es: \n";
cout<<empleado1.obtenerNombre();
cout<<empleado1.obtenerApellido();
cout<<empleado1.obtenerSalario()*12;
cout<<"\t saludos empleado 2 su informacion y su salario anual es: \n";
cout<<empleado2.obtenerNombre();
cout<<empleado2.obtenerApellido();
cout<<empleado2.obtenerSalario()*12;
return 0;
}
¿Qué comando pasas al compilador?
Y Segundo. ¿Qué error recibes al compilar? Supongo que algún error recibes...
comandos?? no se de que comandos hablas, que yo sepa solo hago F9 (compilar y ejecutar). y los errores que recivo todos son: undefined reference to...
estos son los errores:
/home/cabeto14/codigo fuente/practica2.o||In function `main':|practica2.cpp:(.text+0x106)||undefined reference to `Empleado::Empleado(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'|
practica2.cpp:(.text+0x22f)||undefined reference to `Empleado::Empleado(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'|
practica2.cpp:(.text+0x2b1)||undefined reference to `Empleado::obtenerNombre()'|
practica2.cpp:(.text+0x2fe)||undefined reference to `Empleado::obtenerApellido()'|
practica2.cpp:(.text+0x344)||undefined reference to `Empleado::obtenerSalario()'|
practica2.cpp:(.text+0x385)||undefined reference to `Empleado::obtenerNombre()'|
practica2.cpp:(.text+0x3d2)||undefined reference to `Empleado::obtenerApellido()'|
practica2.cpp:(.text+0x415)||undefined reference to `Empleado::obtenerSalario()'|
||=== Build finished: 8 errors, 0 warnings ===|
Con el constructor debes inicializar los miembros de un objeto de la clase:
Empleado::Empleado(string name, string lastname, int pago){nombre = name;
apellido = lastname;
salario = pago;
}
Incluso lo puedes tener más compacto, declarándolo en el .h:
Empleado(string n, string ls, int p): nombre(n), lastname(ls), salario(p) {}El error creo que viene de usar funciones miembro de la clase en el constructor de la clase.
correcto M_X eso ya lo sabia, solo que segui al pie de la letra el ejercicio propuesto por el libro. ademas de esto la implementacion de la funcion obtener ayuda mucho a que el codigo sea mas legible y organizado. muchas gracias por tu aporte. crees que ese sea el motivo por el cual no me compila bien? o tienes alguna otra idea?
gracias
Los hombres usamos gcc para compilar desde la consola o definiendo un fichero makefile, no pulsamos F9 sin dar más pistas, aquí no tenenos una bola de cristal para saber con que o cómo estás compilando. Por favor lee las normas del foro.
En primer lugar deberías poder compilar Empleados.cpp sin que te de errores. ¿Es así, puedes compilar Empleados.cpp sin que te de errores?
[Edito] No podrás compilar Empleado.cpp tiene una cantidad aberrante de errores para lo corto que es el código, revisa tambien Empleado.h te falta alguna variable por declarar. No te doy más pistas pues deberías haber visto esos errores en el momento de compilar.
compañero nerve_net porfavor lea usted las normas del foro, yo en ningun momento lo insulte como para que usted lo haga; yo soy un NOVATO apenas estoy aprendiendo, en consola se compilar con el g++ no sabia que usar el g++ o el gcc definiera si eres hombre o no. yo utilizo el codeblock y en el la opcion de compilar y ejecutar creo que hace lo mismo que si lo hiciera en consola pues usa el mismo compilador gnu. y muchas gracias por su aporte, volvere a hacer el programa desde el inicio y me dare cuenta de mis errores porque quiero seguir aprendiendo. aunque aun no encuentro el error del que hablas...
que tenga un buen dia.
nota: creo que el que el problema no es de mi programa porque, el libro del cual estudio trajo un cd en donde estan los codigos que se muestran en el libro; asi que del cd extraje el ejemplo en donde separan la interfaz de la implementacion (me guie de ese para hacer mi programa) y cuando lo compilo me da el mismo error, identico. sera que no compilo correctamente, o es algun inconveniente del codeblocks.
alguna idea...