Visualizzazione dei risultati da 1 a 4 su 4

Discussione: [C++] Polimorfismo

  1. #1

    [C++] Polimorfismo

    C`e` una cosa che proprio non mi va giu`. Avete mai provato a creare un container di oggetti polimorfici? Beh, io svariate volte, perche` e` una cosa che puo` tornare molto utile, eppure non sono riuscito a trovare MAI una soluzione pulita.

    Perche`? Perche` - porca puttana ladra - ci stanno di mezzo i PUNTATORI!

    codice:
    class base { ... };
    
    class derivata1 : public base { ... };
    class derivata2 : public base { ... };
    class derivata3 : public base { ... };
    
    ...
    Io in pratica vorrei avere la possibilita` di creare, che so, un 'vector' contenente oggetti di tipo 'derivata1', 'derivata2', 'derivata3' etc.

    La cosa sembra banale, e invece mi pare irrisolvibile, perche` si arriverebbe a dover fare cio`:

    codice:
    vector< base* > v( 3 );
    
    v[ 0 ] = new derivata1;
    v[ 1 ] = new derivata2;
    v[ 2 ] = new derivata3;
    
    ...
    Che va bene se scritto cosi`, ma non se passato come parametro a qualche funzione/oggetto, perche` bisogna deallocare gli elementi con 'delete', e non posso sapere quando deallocarli.

    Ho provato:

    1) a derivare 'vector' e riscrivere un costruttore che trasferisca i puntatori e un distruttore che chiami tutti gli opportuni 'delete'; piu` o meno funzionerebbe, ma nel costruttore di copia devo passare l`inizializzatore come 'const' pur dovendolo modificare, quindi, con svariati cast sporchissimi e macchinosi;

    2) con gli auto_ptr, ma non si puo` perche` il costruttore di copia e` abbastanza insolito e incompatibile (per "quasi ovvi" motivi che ora non sto a spiegare), e per cui non si puo` creare neanche un container di auto_ptr.

    Io mi sono arrangiato con degli enum e degli switch opportuni ma.. se sapete come risolvere meglio questo FOTTUTO problema, per favore aiutatemi!

    SONO DI-SPE-RA-TO!

    Grazie .. e buon Natale!

  2. #2
    La testardaggine ha vinto. Mi hanno indicato una strada e adesso sono documentato piu` che sufficientemente.

    Guardate l`ora del post!

    Ora vado a letto.

    (Fine del monologo..)

    Bai!

    P.S.: se l`argomento interessasse a qualcuno () me lo facesse sapere che ho abbastanza roba..

  3. #3
    Utente di HTML.it
    Registrato dal
    Feb 2002
    Messaggi
    1,202
    Beh, se hai scoperto come fare, posta la soluzione!
    Debian GNU/Linux sid
    Publishing a theory should not be the end of one's conversation with the universe, but the beginning. (Eric S. Raymond)
    Kernel 2.6.14-ck1

  4. #4
    La soluzione e` creare uno smart pointer ad hoc!

    Nel mio caso mi e` bastato crearne uno che gestisse memoria condivisa attraverso un reference counter, in modo da eliminare la risorsa solo nel momento in cui i riferimenti totali ad essa sono 0. In questo modo si possono evitare le deallocazioni multiple, e addirittura l`uso di 'delete'. Pero` in questo caso preciso non si deve poter scrivere sulla memoria perche` puo` essere condivisa da piu` variabili.

    Per rendere piu` flessibile il tutto esistono altre tecniche, fra cui ad es. il "Copy On Write", che crea una copia dedicata della risorsa non appena ci sia la necessita` di apportarvi delle modifiche.

    Questi metodi inoltre ottimizzano anche l`impiego e il risparmio della memoria!

    Ringrazio #coders su IRCnet per il prezioso suggerimento!

    Ora le implementazioni le lascio da parte. Se vi interessano veramente, contattatemi via e-mail.

    Ciao.

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.