Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826

    [c++]stl concatenare liste

    ciao.
    Mi trovo nella necessità di concaterare due liste stl(std::,solo che la prima è una lista di oggetti ABase , la seconda è una lista di oggetti ADerived che derivano da ABase.
    è possibile creare un unica lista di oggetti ABase dalle due o aggiungere la seconda lista alla prima con le stl?

    grazie.

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Solo con una lista di ABase* lo puoi fare.
    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
    Apr 2012
    Messaggi
    510
    Originariamente inviato da shodan
    Solo con una lista di ABase* lo puoi fare.
    Non è strettamente necessario usare una lista di ABase* .
    Lo si può fare con una lista di ABase, inserendo anche valori di ADerived visto che è valido il polimorfismo, per poi effettuare il downcasting per ogni valore estratto che era originariamente di tipo ADerived.

  4. #4
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Appunto per il polimorfismo è necessario un puntatore, altrimenti si ottiene solo l'object splicing di ADerived in ABase.
    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.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    pero' non avete detto come è meglio fare .
    ciao.

  6. #6
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non è questione di come è meglio fare. La questione è: hai liste di oggetti o di puntatori a oggetti?
    Nel primo caso devi convertirli a puntatori (shared_ptr se possibile), nel secondo non è necessario.
    Poi usi std::copy() un paio di volte per concatenare le liste.
    Alla più disperata, usi un paio di for e vai di push_back().
    Cosa c'è di difficile?
    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.

  7. #7
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Solo con una lista di ABase* lo puoi fare.
    Originariamente inviato da shodan
    Appunto per il polimorfismo è necessario un puntatore, altrimenti si ottiene solo l'object splicing di ADerived in ABase.
    Non sono strettamente necessarie liste di ABase* perché il downcasting evita il problema dell' object splicing.

    Non è questione di come è meglio fare. La questione è: hai liste di oggetti o di puntatori a oggetti?
    Nel primo caso devi convertirli a puntatori (shared_ptr se possibile), nel secondo non è necessario.
    Poi usi std::copy() un paio di volte per concatenare le liste.
    Alla più disperata, usi un paio di for e vai di push_back().
    Cosa c'è di difficile?
    Su questo mi trovo d' accordo, se possibile evita di copiare gli elementi delle liste, allo scopo di ridurre il costo.

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2003
    Messaggi
    4,826
    si, scusate se leggevo era meglio.
    grazie.

  9. #9
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Originariamente inviato da Who am I
    Non sono strettamente necessarie liste di ABase* perché il downcasting evita il problema dell' object splicing.
    Sarà, ma a me questo codice:
    codice:
    struct Alfa {
    	virtual ~Alfa() {}
    	int a;
    };
    
    struct Beta : Alfa{
    	~Beta() {}
    	int b;
    };
    
    main ()
    
    Beta b;
    b.a = 7;
    b.b = 9;
    
    Alfa a = b;
    
    
    Beta* c = static_cast<Beta*>(&a);
    cout << c->a << "  --  " << c->b << endl;
    
    Beta* d = (Beta*)&a;
    cout << d->a << "  --  " << d->b << endl;
    
    Beta* e = (Beta*)&a;
    cout << e->a << "  --  " << e->b << endl;
    
    Beta* f = reinterpret_cast<Beta*>(&a);
    cout << f->a << "  --  " << f->b << endl;
    
    Beta g = dynamic_cast<Beta&>(a);
    /*
    	Beta h = (Beta)a;
    	Beta i = static_cast<Beta>(a);
    	Beta j = reinterpret_cast<Beta>(a);
    */
    da un object splicing tramite cast di puntatori, un'eccezione nel dynamic_cast e un errore di compilazione nella parte commentata.
    Altri downcasting non ne conosco.
    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.

  10. #10
    Utente bannato
    Registrato dal
    Apr 2012
    Messaggi
    510
    Ma tu dichiari:

    codice:
    Alfa a = b;
    a è un oggetto che ha memoria propria, se gli viene assegnato il valore di b rimane sempre un oggetto di tipo Alfa, così quando provi ad effettuare il downcasting non ha effetto perché effettivamente è un oggetto di tipo Alfa, non di tipo Beta (e quindi anche di tipo Alfa per ereditarietà).
    Cambia tutto se a non ha memoria propria:

    codice:
    Alfa& a=b;
    A questo punto a sta nella stessa locazione di memoria di b, e il downcasting è valido perché a riferisce un oggetto di tipo Alfa e Beta.

    Edit: Però rimane il problema che std::list fa una copia degli oggetti che vengono inseriti nella lista, per cui mi devo correggere: il mio metodo non può funzionare.

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.