PDA

Ver la versión completa : [Ayuda] error al compilar en c++



serlioner
09/08/2013, 22:41
Hola, repasando una práctica de la universidad he tenido el siguiente error al compilar:
practica_6.cpp:(.text._ZN3poo10Poligono2DC2Ei[_ZN3poo10Poligono2DC5Ei]+0x2d): referencia a `vtable for poo::Poligono2D' sin definir
/tmp/cc5Wy9NN.o: En la función `poo::Poligono2D::~Poligono2D()':
practica_6.cpp:(.text._ZN3poo10Poligono2DD2Ev[_ZN3poo10Poligono2DD5Ev]+0x13): referencia a `vtable for poo::Poligono2D' sin definir
/tmp/cc5Wy9NN.o:(.rodata._ZTIN3poo10Cuadrado2DE[_ZTIN3poo10Cuadrado2DE]+0x10): referencia a `typeinfo for poo::Poligono2D' sin definir
/tmp/cc5Wy9NN.o:(.rodata._ZTIN3poo11Triangulo2DE[_ZTIN3poo11Triangulo2DE]+0x10): referencia a `typeinfo for poo::Poligono2D' sin definir
collect2: error: ld devolvió el estado de salida 1

y no se a que se debe, si podéis mirarlo a ver si encontráis35283 el problema os lo agradecería mucho.
(adjunto archivo con códigos y explicación de la practica)

pakoito
09/08/2013, 22:58
No tienes linkada la librería poo bien. ¿Que IDE usas o cómo compilas?

swapd0
09/08/2013, 23:12
Es un error de linkador.

Si usas el visual estudio o cualquier ide añade los ficheros .cpp al proyecto y compila todo junto.

Si estas haciendolo a pelo, tendras que crear un fichero make y para que compile todos los .cpp y despues linkarlos todos juntos.

-----Actualizado-----

ademas en poligono si no vas a implementar los calculaPerimetro ni calculaArea debe definirlos como virtuales puros.

virtual float calculaPerimetro() = 0;

-----Actualizado-----

No tiene sentido que Poligono herede de Punto2d, ya que es un "contenedor" de puntos

-----Actualizado-----

Este es el mensaje de error que sale en el xcode:


Undefined symbols for architecture x86_64: "typeinfo for poo::Poligono2D", referenced from:
typeinfo for poo::Cuadrado2D in practica_6.o
typeinfo for poo::Triangulo2D in practica_6.o
"vtable for poo::Poligono2D", referenced from:
poo::Poligono2D::~Poligono2D() in practica_6.o
poo::Poligono2D::Poligono2D(int) in practica_6.o
NOTE: a missing vtable usually means the first non-inline virtual member function has no definition.
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Asi que si pones esto en la clase poligono ya no da errores:


virtual float calcularPerimetro() = 0;
virtual float calcularArea() = 0;

serlioner
10/08/2013, 14:52
muchas gracias, algo nuevo que aprendí, gp32spain me estáis salvando el culo mucho en este ámbito (lo de la herencia de Punto2D y otras burradas que habrá fue de probar cosas a ver si así se iba el error, no caí en las funciones virtuales puras).