Undefined reference to (C++) [SOLUCIONADO]

Iniciado por Eskizoide, 30 Octubre 2017, 11:40 AM

0 Miembros y 1 Visitante están viendo este tema.

Eskizoide

Buenas,

yo había hecho un proyecto con 3 clases, menu.cpp y otras dos clases. Mi error fue escribir todo el código de las otras dos clases en un fichero .h y no separar los ficheros.

Bien, fui a separar los ficheros en cabeceras y tal, las declaraciones en .hpp y el codigo en .cpp, y al pasarlo todo, no me da ningún fallo excepto en el menu.cpp donde me salta un "undefined reference" a todas las funciones que he separado en ficheros. Y me estoy volviendo loco porque no se como hacer que funcione. Se que les declaraciones y eso están bien, pero ya no se que más falla. Intenté solucionarlo poniendo #pragma once pero nada sigue igual. A ver si algún alma muy caritativa me ayuda, o al menos me explica que puede estar pasando.

Venga, dejo el código fuente aquí en spoiler por si alguien es mu majete y le echa un vistazo

NFA.hpp

#pragma once
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include "estado.hpp"
#include <set>
#include <string>

using namespace std;

class nfa
{ vector <ESTADO> vectorestado;
 int numeroestados;
 set <char> alfabeto;
 set <int> importantes;
 int estadoinicial;


public:

void llenar_datos(char nombrefichero[], bool& errorapertura);
void mostrar();
void crearalfabeto(int numeroenlaces);
void analizarmuerte ();
void mostraralfabeto();
void estadosimportantes();
bool comprobacionestadodfa();
bool analizarletra (string cadena, int estado, int &camino,
                   vector<int> &estadoactual,vector <char> &simbolo, vector <int> &estadosiguiente);
 void analizarcadena();

};


ESTADO.hpp

#pragma once
#include <vector>
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>

using namespace std;


class ESTADO
{struct siguienteestado_t
    {char simbolotransicion;
     int siguienteestado;
    };

     bool aceptacion;
     bool estadomuerto;
     vector <siguienteestado_t> transicion;

public:

void crearenlace (int numeroenlaces);
   void   set_sigestado (int estado, char simbolo, int pos);
int    get_sigestado(int pos) const;
   char   get_simbolo(int pos) const;
   bool   get_aceptacion(void) const;
   void   set_aceptacion(bool aceptado);
   bool   get_muerto(void) const;
   bool   nodomuerto(int identificador);
   int get_numeroenlaces(void) const;
};


MENU.cpp


#include "nfa.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>

int main()
{ int opcion;
 char fichero[85];
 bool errorapertura; // 0 si se abrio el fichero, en otro caso, no se abrio
 nfa automata;

 do{ cout << endl;
 cout << "SELECCIONE UNA OPCION :" << endl;
 cout << "[1] Leer un archivo .nfa." << endl;
 cout << "[2] Mostrar NFA." << endl;
 cout << "[3] Señalizar estados de muerte." << endl;
 cout << "[4] Mostrar estados importantes." << endl;
 cout << "[5] Analizar cadena." << endl;
 cout << "[6] Comprobacion DFA." << endl;
 cout << "[0] Salir." << endl;
 cout << "OPCION: ";
 cin >> opcion;
 switch(opcion)
   {case 1:
     {cout << "Nombre del fichero: ";
      cin >> fichero;
      automata.llenar_datos(fichero, errorapertura);
      break;
     }
    case 2:
     {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
      else automata.mostrar();
      break;
     }
    case 3:
     {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
     else automata.analizarmuerte();
      break;
     }
     case 4:
     {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
      else automata.estadosimportantes();
      break;
     }
    case 5:
     {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
      else automata.analizarcadena();
      break;
     }
    case 6:
     {if(errorapertura != 0) cout << "ERROR: NO SE ABRIO ANTERIORMENTE EL ARCHIVO CORRECTAMENTE." << endl;
      else
       {if(automata.comprobacionestadodfa()) cout << "Este fichero es un DFA." << endl;
        else cout <<"Este fichero NO es un DFA." << endl;
       }
      break;
     }
    case 0:
     {return 0;
      break;
     }
   }
 }while(opcion != 0);
}






Mil gracias a quien pueda ayudarme!

Gallu

Hola, seguro que no se están linkando bien las fuentes, qué ide estás usando  ?? , has probado en incluir el cpp en lugar del hpp ??

Saludos
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

Eskizoide

Estoy usando devc++, y no me manejo muy bien osea que igual algo del linker está fallando que no entiendo. Y no he probado eso que dices, no se me había ocurrido, probaré a ver, gracias.

Eskizoide

Cita de: Gallu en 30 Octubre 2017, 12:29 PM
Hola, seguro que no se están linkando bien las fuentes, qué ide estás usando  ?? , has probado en incluir el cpp en lugar del hpp ??

Saludos

Hola, nada, eso no funciona, como imaginaba, ya que no accede a los .hpp y pierde variables y tal. He probado a compilarlo por línea de comandos y me sale el mismo error, undefined reference to, así que no creo que sea problema del IDE.

Gallu

Las fuentes (cpp) de los que dependes están compiladas  ???
Nadie alcanza la meta con un solo intento, ni perfecciona la vida con una sola rectificación, ni alcanza altura con un solo vuelo.

Eskizoide

Nada, ya está arreglado, ese era el problema se me olvidó compilar uno de los ficheros, pensaba que cuando compilaba menu.cpp se compilaban el resto. Gracias :)