Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    [c++] utilizzo di piu classi

    Buonasera ragazzi,
    apro questa discussione perchè vorrei cercare di capire come si utilizzano piu classi per esempio devo realizzare una programma che mi permetta di gestire uno store. Ho tre classi:
    1. STORE
    2. APPLICAZIONE
    3. APPLICAZIONEINSTALLATA

    Un oggetto store può contenere fino ad un massimo di 100 applicazioni. Ho pensato di utilizzare come dato membro un puntatore ad applicazione in modo da poter allocare dinamicamente la memoria solo che nell'implementazione del metodo aggiungi_app() non mi fa accedere ai dati dicendomi che sono privati (nonostante la classe sia friend). Anche se non sono sicuro questo sia il procedimento di esatto. Vi posto il codice se c'è qualcuno di voi che mi potrebbe spiegare dove sbaglio o che abbia idee migliore mi farebbe un gran piacere. qui il codice:
    codice:
    //applicazione.h
    #ifndef APPLICAZIONE_H
    #define APPLICAZIONE_h
    #include <string>
    using std::string;
    class applicazione {
        private:
            long id;
            string nome,descrizione;
            int versione;
        public:
            applicazione(long i = 0, string n = " ", string d = " ", int v  = 0):
                id(i) , nome(n) , descrizione(d) , versione (v) {;}
            void set_app(long, string, string, int) const;
            
    };
    #endif

    codice:
    //applicazione.cpp
    #include "applicazione.h"
    void applicazione::set_app(long i, string n, string d, int v){
        id = i;
        nome = n;
        descrizione = d;
        versione = v;
    }

    codice:
    //store.h
    #ifndef STORE_H
    #define STORE_H
    class applicazione;
    class store {
        friend class applicazione;
        private:
            applicazione* p;
        public:    
            store() :
                p(NULL) {;}
            void aggiungi_app() const;
    };
    #endif

    codice:
    //store.cpp
    #include <iostream>
    #include <string>
    #include "store.h"
    #include "applicazione.h"
    using namespace std;
    void store::aggiungi_app()const{
        
        p = new applicazione;
        cout << "inserire id app: " << endl;
        cin >> p->applicazione::id;
        cout << "inserire nome app: " << endl;
        cin >> p->nome;
        cout << "inserire descrizione: " << endl;
        cin >> p->descrizione;
        cout << "inserire versione: " << endl;
        cin >> p->versione;
        
    }
    codice:
    //main.cpp
    #include <iostream>
    #include "applicazione.h"
    #include "applicazioneinstallata.h"
    #include "store.h"
    using namespace std;
    int main () {
        applicazione app;
        applicazioneinstallata appp;
        store s;
        s.aggiungi_app();
        return 0;
    }
    grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    E inutile creare due classi App e AppInstallata.
    Ti serve una classe App.
    Nello store due set e sposti le app da uno all'altro quando le installi/disinstalli.
    App dovrebbe essere un oggetto a se, lo store dovrebbe semplicemente passare le informazioni necessarie al costruttore.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  3. #3
    Il fatto è che sono fortemente vincolato al testo di un esame

  4. #4
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Posta il testo che ne discutiamo allora.
    Comunque nella classe applicazione dovresti indicare friend class store, non come hai fatto tu.
    È la classe stessa che deve dire chi è suo amico e può quindi vedere il suo privato.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  5. #5
    Per ora sono fuori. Domani vedo di postarlo
    Ma per quanto riguarda l'uso del puntatore p per l'assegnamento dei valori, secondo te è corretto come procedimento?

  6. #6
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    No, non è corretto, dovresti usare un costruttore e lasciare perdere friend.
    Il punto di avere delle classi è quello di poter isolare i dettagli implementativi per offrire un interfaccia uniforme. Ciò ti permette di cambiare l'implementazione senza conseguenze negative sul resto. Friend rompe l' incapsulamento.

    È sbagliata anche la divisione in classi. Un app è concettualmente un solo oggetto, non ha senso definire due classi distinte. Al più saranno una figlia dell'altra. Ma in questo caso non ha minimamente senso: Un app non cambia perché è installata o meno. Al massimo aggiungerei un flag nella classe app, ma sono dell'idea che il concetto di installata andrebbe posto nello store e non nell'app.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  7. #7
    si lo capisco ma così vuole il prof. A proposito ecco il testo:

    Un oggetto della classe Applicazione è caratterizzato da un id (long), un nome e una descrizione (entrambe string) e una versione (int). Un oggetto della classe ApplicazioneInstallatata sarà caratterizzato oltre che dai dati precedenti anche dalla memoria occupata (long).
    Lo store, che sarà un oggetto della classe Store, potrò contenere fino a 100 oggetti Applicazione e avrà la possibilità di inserire o rimuovere applicazioni.
    • il metodo che permette l'inserimento di un'applicazione richiede tutti i dati dell'app e la inserisce nello store. Se si inserisce un'applicazione con lo stesso id di una già esistente quella vecchia viene eliminata e sostituita con quella nuova.
    • il metodo per la rimozione di un'applicazione dallo store chiede all'utente l'id e l'applicazione, se esiste, viene rimosta.

    Il gestore applicazioni, che sarà un oggetto della classe GestoreApplicazioni, potrà contenere fino a 10 oggetti ApplicazioneInstallatae avrà la possibilità di stampare i dettagli di tutte le applicazione installate, rimuovere applicazioni gia installate, inserirne di nuove da uno store e richiedere l'aggiornamento di applicazioni già installate.
    • il metodo per la stampa delle applicazioni installate semplicemente stampa i dettagli di tutte le applicazioni installate.
    • il metodo per la rimozione di una applicazione chiede all'utente l'id dell'applicazione e, se presente, viene rimossa,
    • il metodo che permette di inserire applicazioni riceve come parametro un riferimento a uno store ed invocando un opportuno metodo dello tore, elenca le applicazioni presenti e chiede per ciascuna se la si vuole installare. L'installazione dell'applicazione avviene mediante la creazione di un oggetto Applicazione Installata a partire dall'oggetto applicazione presente nello store. Il dato aggiuntivo (la memoria occupata) sarà un numero casuale fra 100 e 2000.
    • il metodo che richiede gli aggiornamenti riceve come parametro un riferimento a uno store, per ciascuna applicazione installata verifica se ve ne è una più recente nello store ed eventualmente la installa.

  8. #8
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    Non c'è scritto da nessuna parte che devi utilizzare friend. Puoi benissimo usare un costruttore.

    L'esercizio è più complesso di come da te spiegato inizialmente.

    Una cosa non mi è chiara: è possibile installare applicazioni da più store. Non è detto che l'intersezione dei set degli id delle applicazioni di due store diversi sia l'insieme vuoto. In quel caso rischi di aggiornare un applicazione con un applicazione completamente diversa.

    Ad ogni modo, tornando al punto: Non hai alcun bisogno di friend: Il metodo per l'inserimento deve solo chiedere i dati e passarli come parametri al costruttore di Applicazione.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  9. #9
    ma questo è il metodo della classe store, che parametri devo passargli? non è che potresti scrivermi un prototipo?
    Inoltre un oggetto della classe store può contenere fino ad un massimo di 100 oggetti applicazione nella maggior parte delle volte utilizziamo l'allocazione dinamica della memoria (anche se non ho capito come).

  10. #10
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
    #include <iostream>#include <sstream>
    #include <limits>
    using namespace std;
    
    
    class Applicazione {
    	private:
    		long id;
    		string nome;
    		string descrizione;
    	public:
    		Applicazione(long id, string nome, string descrizione)
    			:id(id), nome(nome), descrizione(descrizione) {}
    		
    		string to_string(void);
    };
    
    
    string Applicazione::to_string(void) {
      ostringstream oss;
      oss << id << ") " << nome << endl << descrizione;
      return oss.str();
    }
    
    
    class Store {
    	private:
    		Applicazione *app[100];
    		int n;
    	public:
    		Store():n(0) { }
    		~Store() {
    			for(int i = 0; i < this->n; ++i)
    				delete this->app[i];
    		}
    		
    		void aggiungi_applicazione(void);
    		
    		void stampa_applicazioni(void);
    };
    
    
    void Store::aggiungi_applicazione(void) {
    	long id;
    	string nome, descrizione;
    	cout << "Inserisci l'id dell'applicazione: ";
    	cin >> id;
    	cin.ignore(numeric_limits<streamsize>::max(), '\n');
    	cout << "Inserisci il nome dell'applicazione: ";
    	getline(cin, nome);
    	cout << "Inserisci una descrizione dell'applicazione:" << endl;
    	getline(cin, descrizione);
    	this->app[(this->n)++] = new Applicazione(id, nome, descrizione);
    }
    
    
    void Store::stampa_applicazioni(void) {
    	for(int i = 0; i < this->n; ++i)
    		cout << this->app[i]->to_string() << endl;
    }
    	
    
    
    int main() {
    	Store s;
    	s.stampa_applicazioni();
    	s.aggiungi_applicazione();
    	s.stampa_applicazioni();
    	s.aggiungi_applicazione();
    	s.stampa_applicazioni();
    	return 0;
    }
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.