Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [C++] STL e nuove classi

    salve a tutti, ho dei problemi con le STL!
    ho creato una classe basse con dentro metodi virtuali, poi ho creato la sua classe derivata che implementa questi metodi, ma in futuro queste classi derivate saranno di più, ora vogllio mettere all'interno di una mappa elementi di queste classi derivate e allora per poter mettere dentro oggetti di qualsiasi delle classi derivate, nella definizione della mappa metto il nome della base, ma dopo quando voglio tirare fuori questi elementi dalla mappa, come faccio per prendere le caratteristiche della classi derivate e non della classe base... forse è meglio che vi posto il codice:
    codice:
    #include <iostream>
    #include <string>
    #include <fstream>
    #include <map>
    #include <vector>
    #include <sstream>
    
    using std::ifstream;
    using std::ofstream;
    using std::string;
    using std::cout;
    using std::endl;
    using std::cin;
    using std::cerr;
    using std::string;
    using std::istringstream;
    using std::vector;
    
    
    class ps_power_model
    {
    	public :
    
    		ps_power_model(){
    			cerr << "Error 504: Distructor not defined in derived class of ps_power_model" << endl;
    		};
    
    		virtual ~ps_power_model(){
    			cerr << "Error 506: Distructor not defined in derived class of ps_power_model" << endl;
    		};
    
    		virtual void ciao(){
    			cout << "booooo"<<endl;
    		};
    
    		
    		static int get_number_parameter(void){
    			cerr << "Error 504: Function - get_number_parameter() - not defined in derived class of ps_power_model." << endl;
    			exit(1);
    		};
    
    };
    
    class ps_costant_model : public ps_power_model
    {
    public :
    	
    	static int num_param;
    
    	ps_costant_model(){
    		cerr << "Error 510: Distructor not defined in derived class of ps_power_model" << endl;
    	};
    
    	~ps_costant_model(){
    		cerr << "Error 520: Distructor not defined in derived class of ps_power_model" << endl;
    
    	};
    	
    	void ciao(){
    		cout << "Marco foreever"<<endl;
    	};
    	
    	static int get_number_parameter(void){
    		return num_param;
    	};
    };
    
    int ps_costant_model::num_param(3);
    
    ps_power_model * get_power_model(int);
    
    int main(){
    	
    	std::map<string, ps_power_model> power_module_table;
    	std::map<string,ps_power_model>::iterator map_iterator;
    
    
    	string ciao("ciao");
    
    	cout<< ps_costant_model::get_number_parameter() << endl;
    	
    	ps_power_model * model = get_power_model(0); 
    	
    	model->ciao();
    	
    	
    	power_module_table.insert(std::pair<string,ps_power_model>(ciao,(*model)));
    
    	//come faccio a leggere quell'elemento e chiamare il metodo ciao() della giusta classe derivata????????????
    
    }
    
    
    
    
    ps_power_model * get_power_model(int num_of_model){
    
    	switch(num_of_model){
    
    		case 0 :
    						
    			return new ps_costant_model;
    			break;	
    				
    	}
    };
    grazie a chi avrà la pazienza di rispondermi!!!!!
    :master: :master:
    warcomeb - IL LEADER O.O.O.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381

    Re: [C++] STL e nuove classi

    Devi memorizzare il puntatore, non l'oggetto.
    Ovviamente poi dovrai liberare la memoria.
    codice:
    	std::map<string, ps_power_model*> power_module_table;
    	std::map<string,ps_power_model*>::iterator map_iterator;
    
    	ps_power_model * model = get_power_model(0); 
    	
    	model->ciao();
    	
    	power_module_table.insert(std::pair<string,ps_power_model*>(ciao,model));

  3. #3
    perdonami ma come devo continuare!?
    warcomeb - IL LEADER O.O.O.

  4. #4
    dato che ci sono ti faccio un'altra domanda... se invece dovessi salvare una qualsiasi oggetto all'interno della mappa devo sempre salvare il puntatore????
    warcomeb - IL LEADER O.O.O.

  5. #5
    Ovviamente poi dovrai liberare la memoria.

    qualcuno sa dirmi cosa intedeva shodan quando mi ha detto questo?
    grazie...
    warcomeb - IL LEADER O.O.O.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Il polimorfismo funziona solo per puntatori e reference. Dato che hai una classe base con i metodi virtuali, occorre memorizzare il puntatore come ti ho fatto vedere.

    Per recuperarlo devi fare così:
    codice:
    std::map<string,ps_power_model>::iterator map_iterator;
    
    map_iterator = power_module_table.find("stringa chiave")
    
    if (map_iterator != power_module_table.end()) {
       map_iterator->second->ciao(); 
    }
    oppure
    codice:
    power_module_table["stringa chiave"]->second->ciao();
    Personalmente preferisco la prima forma, che permette di controllare se una chiave è già presente.

    Per quanto riguarda la memoria. Una volta che allochi un puntatore, devi essere tu a gestire la deallocazione. La STL non ti viene incontro.

    codice:
    map_iterator = power_module_table.begin();
    while (map_iterator != power_module_table.end()) {
        delete map_iterator->second;
        ++map_iterator;
    }
    power_module_table.erase(power_module_table.begin(),power_module_table.end());
    dato che ci sono ti faccio un'altra domanda... se invece dovessi salvare una qualsiasi oggetto all'interno della mappa devo sempre salvare il puntatore????
    Se ti interessa il polimorfismo (come in questo caso), si. Però se vuoi salvare oggetti non polimorfici, ricorda che la STL richiede un costruttore di copia e l'operatore di assegmento, pubblici.
    P.S.
    Per la creazione controllata di oggetti, suggerirei di dare un'occhiata al Pattern Factory.

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.