En esta ocasión, intento trabajar los conceptos de composición y trabajo con lo siguiente:
- Una clase Punto. Donde trabajo con punto.cc y punto.h, en el primero las implementaciones y en el segundo las cabezeras y definición de la clase.
- Una clase Spair, que cuenta con sus ficheros .cc y .h al igual que la clase punto.
- Un fichero Programa.cc donde elaboraré las pruebas con las distintas funciones y constructores que quiero trastear.
El problema viene, que ahora que tengo una versión lo más sencilla posible, a la hora de compilar solo consigo generarme errores que me dicen que existen referencias sin definir.
Lo que llevo programado hasta el momento, es lo siguiente
Punto.cc
Código:
Punto.h#include <punto.h> punto::punto(const int o, const int a){ data.SetAbscisa(a); data.SetOrdenada(o); };
Código:
La clase punto, tiene que recibir por composición un área de datos basada de tipo spair<k,v>, por eso creo los dos ficheros de la clase spair.#ifndef __EDI_PUNTO_H_ #define __EDI_PUNTO_H_ #include <iostream> #include <spair.h> //using namespace std; class punto { public: // constructores punto (); // punto (0,0) punto (int x, int y); // punto (x,y) // asignacion void operator = (const punto & rhs); // observadores int abcisa () const; int ordenada () const; private: // area de datos // Un par de enteros (x:ordenada, y:abcisa) spair<int, int> data; }; #endif
Spair.cc
Código:
Spair.h#include <spair.h> template<class T, class U> spair<T,U>::spair(const int o, const int a){ abscisa = a; ordenada = o; };
Código:
Programa.cc#include <iostream> //using namespace std; template <class T, class U> class spair { public: // Constructor spair (int x, int y); spair (); // Asignacion T SetAbscisa (T abs); U SetOrdenada(U ord); private: T abscisa; U ordenada; };
Código:
Con estos cinco ficheros, creo que el orden correcto de compilación, sería#ifndef __EDI_PUNTO_H_ #define __EDI_PUNTO_H_ #include <iostream> #include <spair.h> #include <punto.h> using namespace std; int main (){ punto a; cout << a; cout << "Hola Mundo"; } #endif
1º Compilar la clase Spair
Código:
Utilizo la opción -I para seleccionar el directorio donde quiero que busque spair.h, pero esta compilación, ya empieza a fallar dándome errores de falta de referenciasg++ ./Escritorio/spair.cc -I ./Escritorio
Código:
2º Compilar la clase Punto, con los mismos errores que en el punto uno pero propios de su clase./usr/lib/gcc/x86_64-linux-gnu/4.7/../../../x86_64-linux-gnu/crt1.o: En la función `_start': (.text+0x20): referencia a `main' sin definir /tmp/ccKOnjJP.o: En la función `__static_initialization_and_destruction_0(int, int)': spair.cc:(.text+0x23): referencia a `std::ios_base::Init::Init()' sin definir spair.cc:(.text+0x32): referencia a `std::ios_base::Init::~Init()' sin definir collect2: error: ld devolvió el estado de salida 1
3º Compilar el Programa, cosa aún no he podido realizar pero que se supone, que tendría que hacer en función de dos objetos que son el resultado de la compilación correcta de las dos clases anteriores.
Llevo toda la tarde haciendo todo tipo de pruebas y aún no he dado con lo que falla, probablemente sea un error estúpido y simple, pero estoy empezando a investigar en este mundillo... cualquiera que me aportase un poco de luz o me diese alguna idea, no se si meter algún typdef en punto para los valores de abscisa y ordenada, me sería de gran ayuda.
Gracias