Visualizzazione dei risultati da 1 a 10 su 15

Hybrid View

  1. #1
    Leggendo il codice, mi sembra che tu abbia un po' di confusione sulle "responsabilità" della classe LinkedList... la classe LinkedList<T> è una classe generica (template), che deve occuparsi semplicemente di contenere oggetti di un generico tipo T; perché fa riferimento a Persona o a Contatto? L'unico tipo "esterno" a cui deve fare riferimento LinkedList è T, ovvero l'argomento template.

    In altre parole: il punto dell'usare i template in questo caso è scrivere un contenitore che possa funzionare con qualunque tipo, senza rimanere legati a Persona o Contatto o quello che vuoi. Poi nel main o dove vuoi scriverai LinkedList<Contatto>, e ci potrai inserire dentro oggetti di tipo Contatto, che costituiranno la tua rubrica.

    Poi: la classe LinkedList ha un'interfaccia che non ha senso. Come può essere che aggiungi ed elimina siano funzioni che non prendono alcun argomento? Da dove pescano l'elemento da aggiungere/eliminare? Un'interfaccia più sensata sarebbe del tipo:
    codice:
    void aggiungi(T elemento);
    void elimina(T elemento); // su questo ci sarebbe da discutere, comunque...
    Anche sulla classe Persona, non capisco perché hai i metodi add_nome e compagnia: o lasci i membri pubblici (e da fuori ci scrivi dentro quel che ti pare), oppure metti i membri privati e scrivi i metodi getter e setter (string get_nome()/void set_nome(string nome)). Dei metodi come add_nome (che peraltro non riceve alcun parametro? ) per una struttura contenente un numero fissato di record non hanno senso.

    Io fossi in te ripartirei da capo, riordinandomi un po' le idee su cosa deve fare ciascuna classe, e cercando di capire quale dovrebbe essere l'interfaccia che dovrebbero esporre; se vuoi una mano in questo senso potrebbe essere utile avere la consegna completa del problema, visto che ci sono diverse cose che non mi tornano già così (come ci si aspetta che la print() faccia qualcosa di sensato su un tipo generico? come si dovrebbe scorrere una linked list con un'interfaccia di questo genere?).
    Amaro C++, il gusto pieno dell'undefined behavior.

  2. #2
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    15
    Ciao MItaly,
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    In altre parole: il punto dell'usare i template in questo caso è scrivere un contenitore che possa funzionare con qualunque tipo, senza rimanere legati a Persona o Contatto o quello che vuoi. Poi nel main o dove vuoi scriverai LinkedList<Contatto>, e ci potrai inserire dentro oggetti di tipo Contatto, che costituiranno la tua rubrica.
    ok, credo di aver capito l'errore concettuale che ho fatto...

    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Poi: la classe LinkedList ha un'interfaccia che non ha senso. Come può essere che aggiungi ed elimina siano funzioni che non prendono alcun argomento? Da dove pescano l'elemento da aggiungere/eliminare? Un'interfaccia più sensata sarebbe del tipo:
    codice:
    void aggiungi(T elemento);
    void elimina(T elemento); // su questo ci sarebbe da discutere, comunque...
    Anche sulla classe Persona, non capisco perché hai i metodi add_nome e compagnia: o lasci i membri pubblici (e da fuori ci scrivi dentro quel che ti pare), oppure metti i membri privati e scrivi i metodi getter e setter (string get_nome()/void set_nome(string nome)). Dei metodi come add_nome (che peraltro non riceve alcun parametro? ) per una struttura contenente un numero fissato di record non hanno senso.
    non passavo alcun parametro perchè poi all'interno della funzione scrivevo delle cout e cin che mi chiedevano i valori, però collegandomi a quanto dicevi prima, non è corretto fare così perchè il template non sarebbe più generico, giusto!?

    Credo che mi sono confusa le idee nel momento in cui mi è stato detto di creare una nuova classe Contatto da utilizzare nel template ListaContatto, non so più chi deve fare cosa. O meglio, immagino che le operazioni di aggiunta rimozione e stampa debba essere fatta dal template, ma a questo punto a cosa mi serve la classe Contatto!?

    Scusa se sono un po' recidiva!!! ci sto provando...

  3. #3
    Quote Originariamente inviata da monia82 Visualizza il messaggio
    Ciao MItaly,
    non passavo alcun parametro perchè poi all'interno della funzione scrivevo delle cout e cin che mi chiedevano i valori, però collegandomi a quanto dicevi prima, non è corretto fare così perchè il template non sarebbe più generico, giusto!?
    Esatto. Concettualmente un container come LinkedList dovrebbe occuparsi esclusivamente di contenere gli elementi che gli viene detto di memorizzare "da fuori".
    Credo che mi sono confusa le idee nel momento in cui mi è stato detto di creare una nuova classe Contatto da utilizzare nel template ListaContatto, non so più chi deve fare cosa. O meglio, immagino che le operazioni di aggiunta rimozione e stampa debba essere fatta dal template, ma a questo punto a cosa mi serve la classe Contatto!?
    Non è molto chiaro neanche a me esattamente quello che ti è stato chiesto, per quello sarebbe utile che tu postassi il testo dell'esercizio. Una possibilità che mi viene in mente è che Contatto dovrebbe semplicemente contenere un oggetto Persona (che hai già, e che contiene nome e cognome) e ci aggiunge il numero di telefono. Ma, di nuovo, sarebbe meglio vedere il testo dell'esercizio, non vorrei indirizzarti in direzioni sbagliate.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    15
    Grazie MItaly,
    il testo è questo:
    realizzare una Template Class
    template<class T>
    class DblLinked
    {
    }
    implementare aggiungi(T& contatto), rimuovi(T& contatto)e la stampa dell'intera lista (operatore <<)
    Implementare una Classe Persona con dati uso rubrica telefonica e applicarla con la classe DblLinked

    A questo punto mi sta venendo il dubbio anche su come ho creato la struttura per la persona, io l'avevo fatta così:
    codice:
    class Persona
    {
        public:
            char nome[30];
            char cognome[30];
            char tel[30];
     
            void add_nome( );
            void add_cognome( );
            void add_telefono( );
    };

    ma il prof, tramite email, mi ha detto che si aspettava una "chiave" formata da nome e cognome, e il restante dei dati formati dalla coppia attributo-valore, in modo tale che quando stampo viene fuori:
    Mario Rossi
    cellulare - 123456
    cellulare2 - 987654
    indirizzo - blablabla...
    etc etc...


    quindi devo fare qualcosa di più dinamico, giusto? così come l'ho struttato non va bene, cosa mi consigli di fare?
    Grazie ancora per l'aiuto.

    ps. sto andando off topic? devo creare una nuova discussione?

  5. #5
    Quote Originariamente inviata da monia82 Visualizza il messaggio
    Grazie MItaly,
    il testo è questo:
    realizzare una Template Class
    template<class T>
    class DblLinked
    {
    }
    implementare aggiungi(T& contatto), rimuovi(T& contatto)e la stampa dell'intera lista (operatore <<)
    Implementare una Classe Persona con dati uso rubrica telefonica e applicarla con la classe DblLinked
    Ok, allora la cosa è piuttosto semplice.
    La classe DblLinked, come previsto, non deve entrare nel merito, ma semplicemente fornire uno storage generico per il tipo T; la aggiungi andrà ad aggiungere un nodo in coda (o in testa) alla lista, copiandoci dentro il valore che ti viene passato (nota che qui `contatto` non è inteso come tipo, ma semplicemente come nome del parametro della aggiungi).

    Analogamente, nella rimuovi andrai a cercare un nodo il cui elemento risulta uguale a quello che ti viene passato ed eliminerai il nodo corrispondente.

    Nella stampa poi userai l'operatore << per stampare tutti gli elementi (scorri la lista e per ciascun elemento fai std::cout<<nodo.elemento).

    [/I]A questo punto mi sta venendo il dubbio anche su come ho creato la struttura per la persona, io l'avevo fatta così:
    [/FONT]
    codice:
    class Persona
    {
        public:
            char nome[30];
            char cognome[30];
            char tel[30];
     
            void add_nome( );
            void add_cognome( );
            void add_telefono( );
    };
    [FONT=arial]
    ma il prof, tramite email, mi ha detto che si aspettava una "chiave" formata da nome e cognome, e il restante dei dati formati dalla coppia attributo-valore, in modo tale che quando stampo viene fuori:
    Mario Rossi
    cellulare - 123456
    cellulare2 - 987654
    indirizzo - blablabla...
    etc etc...
    Boh, per ora non starei a preoccuparmene, il testo del problema non mi sembra che menzioni nulla del genere, e una cosa del genere richiede un po' più di "magia" di quanto credo sappiate usare.

    Per il resto, per Persona io mi aspetterei una cosa del tipo:
    codice:
    struct Persona
    {
        std::string nome;
        std::string cognome;
        std::string indirizzo;
        std::string telefono1;
        std::string telefono2;
    };
    (ammesso che possiate usare std::string, in caso contrario dovranno essere degli array di char).

    Le altre due cose importanti da implementare a quel punto sono:
    • l'overload dell'operator== (altrimenti la lista non può sapere nella remove quando due elementi sono uguali);
    • l'overload dell'operator<< (altrimenti la lista non può stampare gli elementi nella stampa()).

    Le due cose ti risultano più o meno note?
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    codice:
    struct Persona
    {
        std::string nome;
        std::string cognome;
        //...
    };
    Visto che per mail gli ha detto che si aspettava un unica chiave andando a interpretazione magari si aspettava che nome e cognome fossero memorizzati nella stessa stringa:
    codice:
    //...
       std::string nome_cognome;
    //...
    Cosa che per altro semplificherebbe una possibile futura funzione d'ordinamento.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    15
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    Cosa che per altro semplificherebbe una possibile futura funzione d'ordinamento.
    Si grazie, seguirò anche questo consiglio!

  8. #8
    Utente di HTML.it
    Registrato dal
    Nov 2011
    Messaggi
    15
    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Boh, per ora non starei a preoccuparmene, il testo del problema non mi sembra che menzioni nulla del genere, e una cosa del genere richiede un po' più di "magia" di quanto credo sappiate usare.
    ok, ho solo paura che se devo cambiare ka struttura di persona, devo ricominciare tutto da capo!!!

    Quote Originariamente inviata da MItaly Visualizza il messaggio
    Per il resto, per Persona io mi aspetterei una cosa del tipo:
    codice:
    struct Persona
    {
        std::string nome;
        std::string cognome;
        std::string indirizzo;
        std::string telefono1;
        std::string telefono2;
    };
    (ammesso che possiate usare std::string, in caso contrario dovranno essere degli array di char).

    Le altre due cose importanti da implementare a quel punto sono:
    • l'overload dell'operator== (altrimenti la lista non può sapere nella remove quando due elementi sono uguali);
    • l'overload dell'operator<< (altrimenti la lista non può stampare gli elementi nella stampa()).

    Le due cose ti risultano più o meno note?
    mmm... gli overload non proprio, però adesso che me lo hai detto me lo studierò! Ho visto che in alcuni casi, al posto di std::string viene usato il char* che differenza c'è fra i due?
    Grazie mille.

  9. #9
    Quote Originariamente inviata da monia82 Visualizza il messaggio
    ok, ho solo paura che se devo cambiare ka struttura di persona, devo ricominciare tutto da capo!!!
    Il punto di avere una lista e un'interfaccia generica è che puoi cambiare com'è fatta la struttura Persona senza dover mettere mano al resto del codice, per cui puoi stare tranquilla, se si fanno le cose per bene si può cambiare idea su tante cose in seguito senza per questo dover riscrivere tutto da capo.
    Ho visto che in alcuni casi, al posto di std::string viene usato il char* che differenza c'è fra i due?
    Un char * è semplicemente un puntatore ad un char, che tipicamente punta ad un array stile C di caratteri terminati da un carattere nullo. È il modo "classico" del C di gestire le stringhe, ma pone diversi problemi (la gestione della "durata di vita" delle stringhe spesso non è banale, per qualunque operazione bisogna usare funzioni di libreria e ci sono mille menate di gestione delle dimensioni massime del buffer). Di fatto in C++ nel 99% dei casi vuoi usare std::string, che incapsula un array di caratteri in una classe facile da gestire.

    Comunque sono cose da primi capitoli del manuale di C++, probabilmente prima di proseguire un ripassino non guasterebbe...
    Amaro C++, il gusto pieno dell'undefined behavior.

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