Traccia Programmazione ad oggetti. MOLTO DURA

di il
9 risposte

Traccia Programmazione ad oggetti. MOLTO DURA

Salve, mi sono appena iscrito! Gran bel forum

Volevo chidere se qualcuno di voi era in grado di darmi una mano su questa prova d'esame che ho svolto a Luglio, nella mia Università.
Come seconda prova d'esame ho sostenuto questa prova scritta, che purtroppo nè io, nè molti altri, siamo riusciti a farla come si deve.

Eccola qui : http://oi41.tinypic.com/o6mw4o.jp ( vi do il link diretto con l'immagine altrimenti veniva tagliata)

Se qualcuno riesce a darmi una mano gliene sarei davvero grato! Grazie...

9 Risposte

  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

    In un forum come questo non si risolvono esercizi da zero. Si discute sui problemi che hai incontrato nello scrivere il tuo codice.

    Quindi, proponi il codice che hai scritto, commentandolo dove serve e indicando eventuali errori. E poi penso che avrai tante risposte.
  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

    Ok va bene! Abbozzerò nuovamente il codice che avevo scritto e lo discutermo. Non l'ho fatto proprio perchè non sapevo da dove partire , credevo di aver sbagliato tutto. Come posso posto la mia idea
  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

    Rieccomi ragazzi.
    Ho provato a implementare le varie classi della traccia.
    Pensando di fare così :
    1) la classe che mi fornisce la traccia l'ho trascritta cosi com'è.
    2) Ho scritto la classe AccessibleOS1 e AccessibleOS2 ereditando da OperatingSystem. Quindi ho:
    
    
    enum TipoSO { OS1=0, OS2 };
    enum User { A=0, U, G};
    
    class AccessibleOS1 : public OperatingSystem {
    
         public:
    
    	virtual list<string> listFiles(string path) ;
    	virtual bool removeFile (string path) ;
    	virtual string openFile (string path) ;
    	virtual bool createDirectory (string path) ;
    	virtual bool runCommand (string command) ;
    	virtual bool installPackage (string pkgName) ;
    
    // ho aggiunto la funzione getOperating.. qui nel public     ( mi turbano però gli argomenti che prende la funzione , User e TipoSO... non ho capito bene come usarli )
    
    	OperatingSystem* getOperatingSystem ( User u, TipoSO tipo  ); 
    
    // ho pensato di aggiungere nel private un puntatore di tipo OperatingSystem, che restituirò con la famosa funzione getOperatingSystem
       
     private:
    		
    	OperatingSystem  *os;
    
    };
    
    la classe AccessibleOS2 è scritta identica.

    La traccia ora dice: - fornire l'implementazione completa di una massimo di 3 nuove classi che sfruttino il polimorfismo per proteggere o sovrascrivere (overiding) il comportamento delle classi AccessibleOS1 e AccessibleOS2. Poi ci sono le varie tipologie ( User, Administrator e Guest)

    Io avevo pensato di scrivere appunto queste 3 classi sovrascrivendo solo le varie funzioni che mi servono ( ad esempio in administrator servono tutte).

    La cosa che però non capisco proprio è come usare la funzione getOperatingSystem cioè riceve un tipo User e un tipo TipoSO. Se non sbaglio il prof ha detto che questi potevo considerarli come due enum, e in base al caso far scegliere correttamente al sistema quali permessi dare. Quindi non so se è necessario creare le 3 classi ti tipologia degli utente o baste l'enum User..

    Voi avete qualche piccola idea? grazie in anticipo a chi risponderà
  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

    Ciao osvy92

    Dato che definisci questa prova MOLTO DURA non pretendere che ti trovi la soluzione giusta al primo colpo.
    Però se vuoi possiamo parlarne.

    Nel testo c' è questa frase 'la soluzione proposta deve essere flessibile ... l' aggiunta di un nuovo utente si possa ottenere aggiungendo nuove classi di gestione dell' accesso senza alterare quelle esistenti'.

    Quindi si parla di 'classi di gestione', questo mi ha fatto pensare a delle classi che espongono l' interfaccia di un OperatingSystem e che contengono una istanza di un OperatingSystem (stavo pensando al pattern Decorator). Le funzioni di interfaccia regolano l' accesso ai metodi dell' istanza. Quindi le tre classi potrebbero avere dei nomi tipo OsAdministrator, OsGuest, ecc. e quando vengono istanziate ricevono un riferimento al sistema operativo che devono controllare.

    Poi se ho capito giusto la funzione getOperatingSystem non deve essere un metodo di un OperatingSystem ma deve essere qualcosa di separato che permette di creare il corretto OperatingSystem (o meglio una classe di accesso ad un OperatingSystem). Questo tipo di funzioni si chiamano 'Factory method' e servono per l' appunto per creare la classe corretta in un certo contesto, se ti interessa approfondire cerca sotto la voce 'pattern creazionali'.

    A questo punto mi fermo, non vorrei continuare a straparlare senza che ci capiamo e aspetto un tuo parere.
  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

    Esatto!!! Hai capito davvero bene
    Grazie per la risposta!

    Ho cmq creato il tutto e credo sia abbastanza giusto.

    Mi sono regolato cosi però :

    - ho creato la classe generale USER (pura, quindi non istanziabile)
    Questa classe ha nel campo protected un puntatore di tipo OperatingSystem *, che appunto ereditano le altre 3 classi.

    - ho creato le 3 classi che ereditano da USER, quindi ( user, admin e guest)

    - in ognuna di esse ho fatto l'overiding dei metodi che potevano usare. Admin ad esempio può fare tutto.

    -infine in un nuovo file (main.cpp) ho creato il main e anche la funzione getOperatingSystem che restituisce il sistema operativo idoneo in base al tipo che riceve in input. Questa credo sia la cosa più importante, e non sono sicuro di averla fatta bene.
    Lo implementata semplicemente cosi:
    
    OperatingSystem* getOperatingSystem( USER* u, TipoSO t )
    {
    	if( t == ACCESSIBLEOS1 ) return new AccessibleOS1();
    	if( t == ACCESSIBLEOS2 ) return new AccessibleOS2();
    }
    
    
    L'unico dubbio è che non uso proprio USER* u all'interno quindi credo che vada rivista.. tu che ne pensi?
  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

    Ciao osvy92

    Beh, vedo che ci capiamo, e allora avanti!

    - Ok, la classe USER deve contenere un puntatore a un OperatingSystem.

    - Ok, dalla classe USER derivano User, Admin e Guest.

    - La classe USER deve inoltre essere derivata da OperatingSystem, in questo modo può essere usata come se fosse un OperatingSystem e può essere restituita da getOperatingSystem.

    - La classe USER dovrebbe avere un costruttore che accetta un puntatore a un OperatingSystem che poi assegna al suo campo protetto.

    - Nota bene la classe che hai chiamato USER non è da confondere con l' enum 'user' che viene passato a getOperatingSystem.

    - Il metodo getOperatingSystem potrebbe essere qualcosa del genere:
    
    OperatingSystem* getOperatingSystem(user u, TipoSO tipo)
    {
       OperatingSystem* os;
    
       if( t == ACCESSIBLEOS1 ) 
            os = new AccessibleOS1();
       
       if( t == ACCESSIBLEOS2 ) 
            os = new AccessibleOS2();
    
       if (u == ADMIN)
            return new Admin(os);
    
       if (u == USER)
            return new User(os);
    
       if (u == GUEST)
            return new Guest(os);
    }
    
  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

    barba59 ha scritto:


    Ciao osvy92

    Beh, vedo che ci capiamo, e allora avanti!

    - Ok, la classe USER deve contenere un puntatore a un OperatingSystem.

    - Ok, dalla classe USER derivano User, Admin e Guest.

    - La classe USER deve inoltre essere derivata da OperatingSystem, in questo modo può essere usata come se fosse un OperatingSystem e può essere restituita da getOperatingSystem. Questo non l'ho fatto, provvedo subito.

    - La classe USER dovrebbe avere un costruttore che accetta un puntatore a un OperatingSystem che poi assegna al suo campo protetto. FATTO

    - Nota bene la classe che hai chiamato USER non è da confondere con l' enum 'user' che viene passato a getOperatingSystem.
    ECCO, qui è la cosa che avevo meno chiara! Perchè nella traccia il metodo getOperatingSystem prende ( user u, TipoSO tipo). Invece in quel modo che ho fatto io devo per forza dargli USER*... quindi in questo metodo in base all'utente che ricevi crei un OperatingSystem con le funzioni di quell'utente!! Grande, credo proprio che cosi sia giusto!

    - Il metodo getOperatingSystem potrebbe essere qualcosa del genere:
    
    OperatingSystem* getOperatingSystem(user u, TipoSO tipo)
    {
       OperatingSystem* os;
    
       if( t == ACCESSIBLEOS1 ) 
            os = new AccessibleOS1();
       
       if( t == ACCESSIBLEOS2 ) 
            os = new AccessibleOS2();
    
       if (u == ADMIN)
            return new Admin(os);
    
       if (u == USER)
            return new User(os);
    
       if (u == GUEST)
            return new Guest(os);
    }
    
    ah ho creato anche il main e l'ho impostato cosi, credo sia corretto!!
    enum user { us = 0, gu, ad };
    
    
    int main()
    {
    
    	user hey = us; 
    	user ciao = gu;
    	user me = ad;
    
    	OperatingSystem *windows;
    
    	windows = getOperatingSystem ( hey, ACCESSIBLEOS2 );    // qui gli passo l'utente hey, che dovrebbe avere i permessi da user, quindi può accedere a tutti i metodi tranne l' m3.
    
    	  windows->m1();   
    	  windows->m2();   
    	  windows->m3(); 
    	  windows->m4();
            
    	return 0;
    }
    OUTPUT:
    OS2: m1
    OS2: m2
    ERRORE, comando non abilitato all'utente User!!
    OS2: m4

    Tutto sembra andare bene quindi
  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

  • Re: Traccia Programmazione ad oggetti. MOLTO DURA

    Grazie per l'aiuto!! Alla prossima
Devi accedere o registrarti per scrivere nel forum
9 risposte