Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [c++] funzioni virtuali

    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???????

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,481
    Prendi fiato ...

    Sarebbe bene che tu mostrassi il codice cosi' come lo hai scritto ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    classe base:
    codice:
    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 :

    codice:
    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 :

    codice:
     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; 
    	}
    }

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    A prima vista hai omesso questa dichiarazione.
    codice:
    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;

  5. #5
    No nel mio file c'è!!!!!!!!!

  6. #6

  7. #7
    va bene!!!

    definzione e implementazione classe base :
    codice:
    #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:

    codice:
    #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 :
    codice:
    #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
    codice:
    #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???

  8. #8
    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.

  9. #9
    ora va! ma perchè non posso mettere inline???

  10. #10
    nuovo problema!!!!!!!!

    codice:
    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!!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.