Dev - C++ - Error de Referencia Indefinida

   
Vista:

Error de Referencia Indefinida

Publicado por Sergio (5 intervenciones) el 13/02/2016 21:42:13
Me tira una referencia indefinida en la class Cheque y en la class NotaCredito y no entiendo porque ayudaaaaaa. aqui les adjunto el codigo.




#include <iostream>

using namespace std;

class Documento{
protected:
int numero;
int fecha;
public:
virtual void TipoDocumento();
virtual void LlenarDatos();
virtual void ImprimirDocumento();
};

class Cheque : public Documento{
private:
string Beneficiario;
int Monto;
public:
virtual void TipoDocumento();
virtual void LlenarDatos();
virtual void ImprimirDocumento();
};

class NotaCredito : public Documento{
private:
string Cliente;
int Monto;
string Motivo;
public:
virtual void TipoDocumento();
virtual void LlenarDatos();
virtual void ImprimirDocumento();
};

/*IMPLEMENTACIONES*/
void Documento::TipoDocumento(){}
void Documento::LlenarDatos(){}
void Documento::ImprimirDocumento(){}

/*CHEQUE*/
void Cheque::LlenarDatos(){
cout<<"\nNuevo Cheque";
cout<<"\nNumero de Cheque: ";
cin>> numero;
cout<<"\nFecha: ";
cin>> fecha;
cout<<"\nIngrese el Nombre del Beneficiario: ";
cin.ignore();
getline(cin,Beneficiario);
cout<<"\nIngrese el Monto: ";
cin>> Monto;

}
void Cheque::ImprimirDocumento(){

cout<<"\n\nCheque";
cout<<"\nNumero de Cheque: " << numero;
cout<<"\nFecha del Cheque: " << fecha;
cout<<"\nNombre del Beneficiario: " << Beneficiario;
cout<<"\nMonto del Cheque: " << Monto;

}
/*NOTACREDITO*/
void NotaCredito::LlenarDatos(){
cout<<"\n\nNota de Credito";
cout<<"\nNumero de NC: ";
cin>> numero;
cout<<"\nFecha de NC: ";
cin>> fecha;
cout<<"\nNombre del Cliente: ";
cin.ignore();
getline(cin, Cliente);
cout<<"\nCantidad de NC: ";
cin>> Monto;
cout<<"\nIngrese el Motivo de la NC: ";
cin.ignore();
getline(cin, Motivo);
}
void NotaCredito::ImprimirDocumento(){

cout<<"\n\nNota de Credito";
cout<<"\nNumero de NC: " << numero;
cout<<"\nFecha de NC: " << fecha;
cout<<"\nNombre del Cliente: " << Cliente;
cout<<"\nCantidad de NC: " << Monto;
cout<<"\nMotivo de la NC: " << Motivo;
}

/* ////VARIABLES GLOBALES\\\\ */
int posicion=0;
Documento *tipo_documento[5];

void CrearCheque(){
tipo_documento[posicion] = new Cheque;
tipo_documento[posicion]->LlenarDatos();

posicion++;
}
void CrearNotaCredito(){
tipo_documento[posicion] = new NotaCredito;
tipo_documento[posicion]->LlenarDatos();

posicion++;
}

void MostrarDocumento(){
for (int i = 0; i < posicion; i++){
tipo_documento[i]->ImprimirDocumento();
}
}

void MenuSistema(){
int opc = 0;
do{
cout<<"\n\n *** OPCIONES DE DOCUMENTO *** ";
cout<<"\n1. Crear un Cheque";
cout<<"\n2. Crear una Nota de Credito";
cout<<"\n3. Mostrar Documentos";
cout<<"\n4. Salir del Sistema\n";

cout<<"Ingrese su Opcion: ";
cin >> opc;

switch(opc){
case 1:
CrearCheque();
break;
case 2:
CrearNotaCredito();
break;
case 3:
MostrarDocumento();
break;
default:
break;
}
}while(opc != 4);
}


int main()
{
MenuSistema();
return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

Error de Referencia Indefinida

Publicado por Thanatos (72 intervenciones) el 14/02/2016 02:38:21
Si quieres que una clase actúe como interface (clase abstracta), sus funciones deben ser virtuales puras. Para que la clase Documento funcione como clase abstracta, puedes utilizar una de estas dos opciones:


Para la primera opción, sólo necesitas modificar la declaración de las funciones virtuales de la clase Documento de esta manera:

1
2
3
4
5
6
7
8
9
class Documento {
    protected:
        int numero;
        int fecha;
    public:
        virtual void TipoDocumento() = 0;
        virtual void LlenarDatos() = 0;
        virtual void ImprimirDocumento() = 0;
};


La otra manera, sería modificar la declaracion de la funciones de la clase Documento de esta forma:

1
2
3
4
5
6
7
8
9
class Documento {
    protected:
        int numero;
        int fecha;
    public:
        virtual void TipoDocumento() {};
        virtual void LlenarDatos() {};
        virtual void ImprimirDocumento() {};
};

Si utilizas esta segunda opción, las definiciones de éstas tres funciones (que realizaste en la sección de "implementaciones" de tu código), ya no serían necesarias, así que se tendrían que eliminar estas líneas:

1
2
3
void Documento::TipoDocumento() {}
void Documento::LlenarDatos() {}
void Documento::ImprimirDocumento() {}


Luego de realizar estos cambios, el compilador aún te mostrará algunos mensajes de error, debido a que no has implementado las funciones:

1
2
3
void Cheque::TipoDocumento() {
 
}

1
2
3
void NotaCredito::TipoDocumento() {
 
}

Al tratarse de funciones virtuales, si no las implementas, ocurrirá un error en el proceso de enlazado.

Saludos...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar