Ver Mensaje Individual
  #1 (permalink)  
Antiguo 18/11/2012, 12:26
Avatar de RsG
RsG
 
Fecha de Ingreso: febrero-2008
Mensajes: 16
Antigüedad: 16 años, 10 meses
Puntos: 0
Fallos a la hora de coimpilar y enlazar archivos con g++

A ver, les explico, estoy empezando a trabajar en Ubuntu y usando el compilador de g++ para intentar empezar a elaborar programas más complejos.

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:
#include <punto.h>


punto::punto(const int o, const int a){
  data.SetAbscisa(a); 
  data.SetOrdenada(o);
};
Punto.h
Código:
#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
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.

Spair.cc

Código:
#include <spair.h>


template<class T, class U>
spair<T,U>::spair(const int o, const int a){
  abscisa = a;
  ordenada = o;
};
Spair.h

Código:
#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;
};
Programa.cc

Código:
#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
Con estos cinco ficheros, creo que el orden correcto de compilación, sería

1º Compilar la clase Spair

Código:
g++ ./Escritorio/spair.cc -I ./Escritorio
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 referencias

Código:
/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
2º Compilar la clase Punto, con los mismos errores que en el punto uno pero propios de su clase.
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