Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    [C++] Creazione dinamica di oggetti polimorfici

    Ciao a tutti ragazzi..ho un problema con il polimorfismo in C++ e non ne vado fuori!
    Ho una classe chiamata Musicista e un'altra classe chiamata Strumento con un parametro interno chiamato "Attributo".

    Dichiaro le classi Chitarra e Pianoforte così:

    codice:
    class Chitarra: public Strumento{
    
    };
    
    class Pianoforte: public Strumento{
    
    };
    Poi all'interno di Musicista ho un'array privato di Strumento chiamato "strumenti_conosciuti".

    Quello che non riesco a fare è questo: voglio prelevare da un file una lista con gli strumenti che il musicista sa suonare...es.

    codice:
    Strumento:Chitarra
    Attributo:Elettrica
    
    Strumento:Chitarra
    Attributo:Acustica
    
    Strumento:Pianoforte
    Attributo:A coda
    
    etc..
    Quindi quello che cerco di fare è creare dimanicamente degli oggetti Strumento e metterli nell'array "strumenti_conosciuti".

    In questo caso il codice scritto a mano sarebbe:

    codice:
    vector <Strumento> strumenti_conosciuti;
    
    strumenti_conosciuti.push_back(new Chitarra("Elettrica"));
    strumenti_conosciuti.push_back(new Chitarra("Acustica"));
    strumenti_conosciuti.push_back(new Pianoforte("A coda"));
    Non ho la più pallida idea però di come si possano creare dinamicamente oggetti di tipo diverso! Che dite?

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Ti serve una mappa contenente delle factory function.
    Uno spunto potrebbe essere (non molto sofisticato):
    codice:
    class Chitarra: public Strumento{
        public:
            static Strumento* create(string attr) { return new Chitarra(attr); }
    	
    };
    
    class Pianoforte: public Strumento{
        public:
            static Strumento* create(string attr) { return new Pianoforte(attr); }
    };
    
    
    typedef Strumento* (*PF)(string);
    
    std::map<string,PF> FunctionMap;
    
    FunctionMap.insert(make_pair("Chitarra",&Chitarra::create));
    FunctionMapinsert(make_pair("Pianoforte",&Pianoforte::create));
    
    vector<Strumenti*> instruments;
    
    // Qui le stringhe arrivano da file. Quelle presenti sono solo come esempio.
    instruments.push_back( FunctionMap["Chitarra"]("Elettrica"));
    instruments.push_back( FunctionMap["Chitarra"]("Acustica"));
    instruments.push_back( FunctionMap["Pianoforte"]("A coda"));
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Utente bannato
    Registrato dal
    Oct 2010
    Messaggi
    1,219
    Puoi gestire il tutto con uno switch, una volta che leggi dal file le stringhe strumento e attributo (che chiamo rispettivamente str e att) :

    codice:
    switch(str)
    {
        case "Chitarra":
            strumenti_conosciuti.push_back(*new Chitarra(att));
            break;
        ...
        ecc ...
        ...
    }

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2009
    Messaggi
    487

    Grazie!

    Grazie! ho gestito temporaneamente con una serie di if else (dato che lo switch è solo per interi) ma il metodo delle function map è più elegante e ordinato, quindi lo implementerò prima o poi sostituendolo agli if else.

    Grazie ancora!

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