Progetto che funzioni con varie implementazioni della lista

di il
6 risposte

Progetto che funzioni con varie implementazioni della lista

Salve sto lavorando ad un progetto per l'università,ed ho qualche problema con un punto della traccia, che non è molto semplice da spiegare, ma sto impazzendo e vorrei una mano...Provo a spiegarvi il tutto:

Come detto prima, ho un progetto che dovrà usare (ad esempio) un unica struttura dati lista.h.
Avrò varie realizzazioni di questa lista, con vettori e puntatori (chiamate entrambe lista.h).
La traccia chiede che queste due strutture siano intercambiabili nel progetto,e quindi potrò mettere la lista con puntatori, compilare il tutto e farlo funzionare senza problemi, successivamente mettere la lista con vettori compilare il tutto, che dovrà funzionare senza cambiare codice o creare problemi.

Sono un po nel panico perché non riesco bene a capire come una cosa del genere possa essere possibile, prima di postare qui ho cercato molto su internet ma problemi simili non ne ho trovati...
So che non è facile non postando codice , ma c'è qualcuno che può darmi qualche consiglio o input per risolvere questo problema?
Spero di essermi spiegato

6 Risposte

  • Re: Progetto che funzioni con varie implementazioni della lista

    Puoi pubblicare tutto il testo relativo al progetto?
  • Re: Progetto che funzioni con varie implementazioni della lista

    Non penso di poter postare documentazione o codice che alla fine non sono mie :\
    Ecco perchè ho provato bene o male a spiegare ciò che non riesco a fare..
    Scusa :\
  • Re: Progetto che funzioni con varie implementazioni della lista

    L'idea è semplice: Devi usare una lista. Tu sei l'utilizzatore a chiedi a vari programmatori di fare un contenitore di tipo lista dove le operazioni sono: inserimento/eliminazione/ricerca/stampa ecc.
    Più programmatori ti mandano la lista sotto forma di libreria statica (.lib) dove tu non hai il codice ma solo il file header delle funzioni che puoi chiamare. Le funzioni devono essere le stesse, lo svolgimento no. Questo è un esempio che ti può capitare.

    L'esempio nella vita reale lo trovi per esempio nel header <list> delle classi STL. Senza divulgare troppo, noi come utilizzatori sappiamo solo le funzioni da chiamare, invece lo svlgimento delle funzioni cambia (anche se non di molto) a seconda di chi ti da il header <list> perche ogni produttore di librerie è libero di svolgerli come vuole ma le funzioni esposte devono eseguire uno standard.
  • Re: Progetto che funzioni con varie implementazioni della lista

    skynet ha scritto:


    L'idea è semplice: Devi usare una lista. Tu sei l'utilizzatore a chiedi a vari programmatori di fare un contenitore di tipo lista dove le operazioni sono: inserimento/eliminazione/ricerca/stampa ecc.
    Più programmatori ti mandano la lista sotto forma di libreria statica (.lib) dove tu non hai il codice ma solo il file header delle funzioni che puoi chiamare. Le funzioni devono essere le stesse, lo svolgimento no. Questo è un esempio che ti può capitare.

    L'esempio nella vita reale lo trovi per esempio nel header <list> delle classi STL. Senza divulgare troppo, noi come utilizzatori sappiamo solo le funzioni da chiamare, invece lo svlgimento delle funzioni cambia (anche se non di molto) a seconda di chi ti da il header <list> perche ogni produttore di librerie è libero di svolgerli come vuole ma le funzioni esposte devono eseguire uno standard.
    Ciao Skynet, prima di tutto grazie della risposta.
    La cosa che mi lascia un po' perplesso è proprio questa, se ho capito.
    Io dovrei creare queste due implementazioni di lista ok? Ma se nel progetto dovrò creare una lista di qualsiasi tipo, non sarò vincolato dall'implementazione scelta (tipo la dimensione del vettore)?

    O ad esempio questi due metodi:
    lista puntatori
    
    template <class L> Cella<L>* Lista<L>::primolista() const 
    {
        return (lista); //dove lista è un puntatore a cella
    }
    
    lista vettori:
    
    template <typename T> int lista<T>::primolista() const
    		{
    	return (0);
    		}
    
    Nella prima mi viene restituito un puntatore, mentre nell'altra un intero giusto?
    Quindi implementando una lista con puntatori, da qualche parte nel progetto qualche funzione si aspetterò un puntatore, e non un intero... è proprio questo che non riesco a capire... come rendere intercambiabile una cosa del genere?
    (ancora una volta, so di non essere stato chiarissimo, ma grazie in anticipo per la risposta!)
  • Re: Progetto che funzioni con varie implementazioni della lista

    E' semplice:
    1) devi definire un'interfaccia, cioe' una classe C++ con solo metodi virtuali, in cui elenchi le operazioni che puoi fare sulla lista. Ovviamente questa interfaccia non deve sapere nulla della possibile implementazione della lista
    2) devi definire una funzione, che avra' sempre lo stesso nome per le due implementazioni, con cuoi creare un' istanza della lista. La funzione ha come tipo di ritorno l'interfaccia, ma crea un' oggetto (vedi il punto 3)
    3) devi creare due classi che implementano l'interfaccia, e che implementano la lista nei due modi. Saranno le istanze di queste classi ad essere create dalla funzione del punto 2)

    Questa e' la versione semplice

    Poi c'e' la versione complicata che usa solo i template, ma dovresti avere ben chiaro come viene fatta l'espansione dei template.

    E' evidente che l'utilizzatore della lista non deve sapere nulla su come viene implementata, altrimenti non sarebbe possibile sostituire l'implementazione.

    Devi trovare un insieme di caratteristiche della lista che sono utili a chi la deve utilizzare, e che sono indipendenti da come viene implementata.

    Ad esempio:

    la lista e' vuota?
    quanti elementi ci sono nella lista?
    aggiungi un elemento alla lista
    ...
  • Re: Progetto che funzioni con varie implementazioni della lista

    migliorabile ha scritto:


    E' semplice:
    1) devi definire un'interfaccia, cioe' una classe C++ con solo metodi virtuali, in cui elenchi le operazioni che puoi fare sulla lista. Ovviamente questa interfaccia non deve sapere nulla della possibile implementazione della lista
    2) devi definire una funzione, che avra' sempre lo stesso nome per le due implementazioni, con cuoi creare un' istanza della lista. La funzione ha come tipo di ritorno l'interfaccia, ma crea un' oggetto (vedi il punto 3)
    3) devi creare due classi che implementano l'interfaccia, e che implementano la lista nei due modi. Saranno le istanze di queste classi ad essere create dalla funzione del punto 2)

    Questa e' la versione semplice

    Poi c'e' la versione complicata che usa solo i template, ma dovresti avere ben chiaro come viene fatta l'espansione dei template.

    E' evidente che l'utilizzatore della lista non deve sapere nulla su come viene implementata, altrimenti non sarebbe possibile sostituire l'implementazione.

    Devi trovare un insieme di caratteristiche della lista che sono utili a chi la deve utilizzare, e che sono indipendenti da come viene implementata.

    Ad esempio:

    la lista e' vuota?
    quanti elementi ci sono nella lista?
    aggiungi un elemento alla lista
    ...
    Ciao, grazie della risposta!
    C'è da qualche parte un esempio per una cosa del genere? Non riesco bene a capire come farlo :\
Devi accedere o registrarti per scrivere nel forum
6 risposte