PDA

Visualizza la versione completa : [c++] funzioni virtuali


PeppePes88
14-04-2008, 20:12
ciao..

Vi presento il mio problema, io ho una classe base astratta dove ho una funzione virtuale pura publica, posso modificare le dati privati solo tramite i metodi proteti, io faccio una classe derivata da questa, ma quando vado a riscrivere la funzione virtuale mi da questo errore su ogni metodo della classe base che uso :
undefenied reference to nome del metodo!
undefenied reference to nome del metodo!

spero di essermi spiegato!!
mi potette aiutare???????

oregon
14-04-2008, 20:40
Prendi fiato ...

Sarebbe bene che tu mostrassi il codice cosi' come lo hai scritto ...

PeppePes88
14-04-2008, 21:12
classe base:


class Dichiarazione{
private:
static int attuale_registro;
int registro;
protected:
bool set_registro(int);
int get_registro_attuale(void) const;
static bool set_registro_attuale(int);
public:
int get_registro(void) const;
virtual int inserisci_in_memmoria(void) = 0; // funzione virtual pura
};


classe derivata :



class Identificatore : public Dichiarazione {
private:
TIPO tipo;
public:
bool set_tipo ( TIPO);
TIPO get_tipo(void) const;
virtual int inserisci_in_memmoria(void); // funzione incriminata
};


Implementazione della funzione :



int Identificatore::inserisci_in_memmoria(void) {

switch(get_tipo()) {
case 0:
Dichiarazione::set_registro_attuale(1); return 1;
break;
case 1:
Dichiarazione::set_registro_attuale(9); return 2;
break;
}
}

shodan
15-04-2008, 01:51
A prima vista hai omesso questa dichiarazione.


class Dichiarazione{
private:
static int attuale_registro;
int registro;
protected:
bool set_registro(int);
int get_registro_attuale(void) const;
static bool set_registro_attuale(int);
public:
int get_registro(void) const;
virtual int inserisci_in_memmoria(void) = 0; // funzione virtual pura
};
int Dichiarazione::attuale_registro;

PeppePes88
15-04-2008, 11:02
No nel mio file c'è!!!!!!!!!

MacApp
15-04-2008, 11:43
Posta tutto il codice che facciamo prima.
;-)

PeppePes88
15-04-2008, 11:56
va bene!!!

definzione e implementazione classe base :


#ifndef DICHIARAZIONE_H
#define DICHIARAZIONE_H

#include <string>
using namespace std;

enum TIPO { INT, DOUBLE, FLOAT, LONG };

class Dichiarazione{
private:
string nome; // nome dell 'oggetto
static int attuale_registro; // posizione attuale del registro
int registro;
int linea_dichiarazione; // posizione della dichiarazione;
protected:
bool set_nome ( const string&);
bool set_linea_dichiarazione(int); //
bool set_registro(int);
int get_registro_attuale(void) const;
static bool set_registro_attuale(int);
public:
string get_nome (void) const;
int get_linea_dichiarazione(void) const ;
int get_registro(void) const;
virtual int inserisci_in_memmoria(void) = 0;
};
#endif


file dichiarazione.cpp:



#include "dichiarazione.h"

int Dichiarazione::attuale_registro = 0; // setto la variabile static a zero

inline bool Dichiarazione::set_nome( const string& stringa) {
nome = stringa;
return true;
}

inline string Dichiarazione::get_nome(void) const {
return nome;
}


inline bool Dichiarazione::set_linea_dichiarazione( int numero_linea) {

if ( numero_linea<= 0) return false;
else {
linea_dichiarazione = numero_linea;
return true;
}
}

inline int Dichiarazione::get_linea_dichiarazione(void) const {
return linea_dichiarazione;
}

inline bool Dichiarazione::set_registro( int valore) {
if ( valore < 0) return false;
registro = valore;
return true;
}

inline int Dichiarazione::get_registro (void) const {
return registro;
}

inline int Dichiarazione::get_registro_attuale(void) const {
return attuale_registro;
}

inline bool Dichiarazione::set_registro_attuale(int valore) {
if ( valore < 0) return false;
else
attuale_registro = valore;
return true;
}


classe derivata :



#include "dichiarazione.h"

#ifndef IDENTIFICATORE_H
#define IDENTIFICATORE_H

class Identificatore : public Dichiarazione {
private:
TIPO tipo; // tipo variabile;
public:
bool set_nome ( const string &); // setta il nome dell'oggetto
bool set_linea_dichiarazione( int ); // setta la linea
bool set_tipo ( TIPO);
TIPO get_tipo(void) const;
virtual int inserisci_in_memmoria(void);
};


#endif


identificatore.cpp


#include "Identificatore.h"

inline bool Identificatore::set_tipo ( TIPO t){ /
tipo = t;
return true;
}

inline TIPO Identificatore::get_tipo(void) const {
return tipo;
}


inline bool Identificatore::set_nome ( const string& stringa) {
return Dichiarazione::set_nome(stringa);
}

inline bool Identificatore::set_linea_dichiarazione( int riga) {
return Dichiarazione::set_linea_dichiarazione(riga);
}

int Identificatore::inserisci_in_memmoria(void){
set_registro_attuale(4);
}



vi puo essere d'aiuto???

MacApp
15-04-2008, 12:04
togli "inline" dalla definizione di "bool Dichiarazione::set_registro_attuale(int valore)" in dichiarazione.cpp.

Dato che ci sei restituisci un valore al chiamante in "int Identificatore::inserisci_in_memmoria" identificatore.cpp e rinomina Identificatore.h in identificatore.h, oppure identificatore.cpp in Identificatore.h, insomma o tutti e due minuscoli o tutti e due maiuscoli.

PeppePes88
15-04-2008, 12:11
ora va! ma perchè non posso mettere inline???

PeppePes88
15-04-2008, 20:19
nuovo problema!!!!!!!!



map<Key_name,Dichiarazione *>::const_iterator i = ts.Mappa_simboli.begin();
for (; i != ts.Mappa_simboli.end(); i++) {
Identificatore * p = dynamic_cast<Identificatore *>(*i);


Dove Mappa simboli è una mappa con chiave cost string e oggetti puntatori a dichiarazione che è la classe base che ho già postato!

Ottengo un errore che mi dice che è impossiile convertire il risultato di *i in Identificatore *!!! Io non capisco perchè , il risultato di *i è l'oggetto della mappa quindi un puntatore alla classe base , che si puo convertire tranquillamente nella classe derivata!!!

Loading