Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420

    [c++] variabili "virtual"

    Salve a tutti,
    io ho un qualcosa del genere:
    codice:
    Class A
    {
    protected:
    const int pippo = 5;
    int pluto;
    
    public:
    A()
    {
    pluto = pippo;
    }
    
    };
    
    
    Class B : public A
    {
    const int pippo = 10;
    
    }

    Nella class B che estende A ho ridefinito pippo e giustamente quando creo un oggetto di tipo B alla variabile pluto gli viene assegnato il valore 5 invece che il valore 10.
    Io vorrei invece che gli venisse assegnato il valore 10. Questo si può fare scrivendo opportuno codice nel costruttore di B ma questo vorrei evitarlo. Penso che si possa fare scrivendo una funzione virtuale che restituisca il valore di pippo ma non so quale sia il metodo più efficiente e più usato in questi casi..
    qualche suggerimento?
    the sALIEN

  2. #2
    Non credo che con i const si possa fare... non mi pare che una variabile dichiarata in quel modo sia davvero resa come una variabile, mi pare che il compilatore la tratti, appunto, come una costante, per cui in tutto il codice che ne fa uso la sostituisce con il suo valore.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    mi sono scordato di mettere il modificatore static nelle due dichiarazioni di pippo..
    dunque erano const static int pippo = x;

    uhm..Scrivendo codice nel costruttore di B funziona sicuramente, l'ho già provato..
    the sALIEN

  4. #4
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    thx, ora provo a guardare
    the sALIEN

  6. #6
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    Mi sa proprio che non c'è soluzione.. damn it!
    Quel che dicono di fare, nel mio caso è praticamente la stessa cosa che stavo dicendo prima che sono riuscito a fare.. speravo ci fosse qualche altro metodo..
    the sALIEN

  7. #7
    Ma non puoi fare una cosa del genere?
    codice:
    class A
    {
        protected:
        virtual int getPippo() { return 5; };
        //...
    }
    
    class B : public A
    {
        protected:
        virtual int getPippo() { return 10; };
        //...
    }
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jan 2005
    Messaggi
    420
    no.. il problema è che non voglio scrivere codice ridondante nella classe B. Con quella soluzione certo, funziona.. ma è proprio quello che voglio evitare.

    Il mio problema è che sto realizzando un gioco turn-based dove vi sono delle unità di vario tipo (ad es. leoni, cani, insetti ecc) ognuna delle quali ha diverse caratteristiche (vita iniziale, numero di passi per turno ecc e molte altre cose).
    Tutte queste unità hanno in comune alcune cose come ad esempio il fatto che la vita corrente nel costruttore dovrà esser settata uguale alla vita iniziale ecc, e dunque implementando queste cose a livello della classe padre (Unit) mi risparmierei tantissime righe di codice.
    the sALIEN

  9. #9
    Forse intendi una delle tre seguenti?
    codice:
    #include <iostream>
    
    /*
    $ g++ -Wall -ansi -pedantic -Wextra -Wconversion main.cpp
    $ ./a.out
    
    aBase.fValue: 5;
    aDerivata.fValue: 10;
    aBase15.fValue: 15;
    aBase20.fValue: 20;
    aModello25.fValue: 25;
    aModello30.fValue: 30;
    */
    namespace ig{
    	class Base{
    		public:
    		const int fValue;
    		
    		public:
    		Base (void):
    		fValue (5){
    		}
    		
    		Base (const int theValue):
    		fValue (theValue){
    		}
    	};
    	
    	class Derivata: public Base{
    		public:
    		Derivata (void):
    		Base (10){
    		}
    	};
    	
    	
    	template <int TInt>
    	class Modello{
    		public:
    		const int fValue;
    		
    		Modello (void):
    		fValue (TInt){
    		}		
    	};
    }
    
    int main (void){
    	// one
    	const ig::Base aBase;
    	const ig:: Derivata aDerivata;
    	std::cout << "aBase.fValue: " << aBase.fValue << ";" << std::endl;
    	std::cout << "aDerivata.fValue: " << aDerivata.fValue << ";" << std::endl;
    
    	// two
    	const ig::Base aBase15 (15);
    	const ig::Base aBase20 (20);
    	std::cout << "aBase15.fValue: " << aBase15.fValue << ";" << std::endl;
    	std::cout << "aBase20.fValue: " << aBase20.fValue << ";" << std::endl;
    	
    	// three
    	const ig::Modello <25> aModello25;
    	const ig::Modello <30> aModello30;
    	std::cout << "aModello25.fValue: " << aModello25.fValue << ";" << std::endl;
    	std::cout << "aModello30.fValue: " << aModello30.fValue << ";" << std::endl;
    	
    	return 0;
    }

  10. #10
    Utente di HTML.it L'avatar di KrOW
    Registrato dal
    Feb 2009
    Messaggi
    281
    Ciao ... Se ho capito bene il tuo problema, potresti fare una cosa del genere:
    codice:
    struct ConstantData
    {
       ConstantData( int inHP, int inMP, int speed ) : initialHP(inHP), initialMP(inMP), speed(speed) {}
       // Qui tutte le costanti condivise
       const int initialHP;
       const int initialMP;
       const int speed;
    };
    
    
    class Unit
    {
       // Qui tutte le variabili condivise
       int m_currHP;
       int m_currMP;
    protected:
       // Il costruttore deve inizializzare le variabili secondo i valori delle costanti
       Unit( const ConstantData& init ) : currHP(init.m_initialHP), currMP(init.m_initialMP) {}
       virtual ~Base() {}
    };
    
    class Lion : public Unit
    {
       static ConstantData initialData;
    public:
       Lion( ) : Unit( initialData ) {}
    };
    
    class Snake : public Unit
    {
       static ConstData initialData;
       Snake( ) : Unit( initialData ) {}
    };
    Quindi l' inizializzazione delle varie costanti condivise:
    codice:
    ConstantData Lion::initialData( 200,150,20 );
    ConstantData Snake::initialData( 100,50,13 );
    C++ 4ever
    496e2062696e6172696f206e6f6e2063692061767265737469 206e656d6d656e6f2020726f7661746f203a29

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 © 2025 vBulletin Solutions, Inc. All rights reserved.