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!