Confronto tra due map contenute in classi diverse

di il
6 risposte

Confronto tra due map contenute in classi diverse

Ciao a tutti!

ho un "piccolo" problema da risolvere per far funzionare il mio programma in c++ correttamente.

io voglio gestire un ristorante con un programma in c++ in maniera che io possa prenotare un tavolo, visualizzare la lista dei prodotti venduti in questo ristorante, gestire le ordinazioni ecc...

nel mio programma ho 2 classi: Sala e tavolo, dove la sala non è altro che un contenitore di tavoli; Tavolo invece è una classe che riguarda un singolo tavolo:

vi faccio vedere:
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
#include <sstream>
#include <map>
using namespace std;

class Prodotto{
	public:
	int id;
	string descrizione;
	float prezzo;
void listino();//stampo id descrizione e prezzo
};

class Tavolo{
public:
	int numero;
	int posti;
	int persone;
	int conto;
        map<int,int> ordinazioni;
protected:
        bool prenotato;

	Tavolo(){
		prenotato=false;
		conto=0;
		persone=0;
	}
void prenota();
void visualizza();
void ordina();
};
class Sala{
public:
	 
	map<int,Prodotto*> prodotti;
	vector<Tavolo*> tavoli;

void loadfile();//carico tavoli
void loadmagazzino();//carico lista prodotti
void elenca();//visualizzo stato tavoli
void prenotatav();//prenoto un tavolo
void ordinatav();//seleziono il tavolo dove si sta per ordinare una lista di prodotti
void visualizzaMagazzino();//stampo il contenuto della classe prodotto
};
il mio problema è il seguente: in Sala::loadmagazzino() io carico una lista di prodotti recuperato da un file.txt e vengolo salvati in
map<int,Prodotto*> prodotti 
e successivamente salvati nella classe Prodotto. L'idea è di avere una mappa orizzontale rispetto alle classi.
Fin qui nessun problema.

Se voglio ordinare una lista di prodotti, io chiamo la funzione Sala::prenotatav() e mi spedisce al tavolo selezionato, chiamando la funzione Tavolo::ordina(); a questo punto il programma mi chiede codice del prodotto da ordinare e quantità e salvo tutto in un'altra mappa, ovvero
 map<int,int>ordinazioni 
.

La difficoltà che non riesco a superare è quella di confrontare la map Prodotti contenuta in Sala con la map ordinazioni di un tavolo specifico in maniera da:

-verificare che i codici dei prodotti ordinati siano realmente presenti nella mappa globale salvata nella classe Sala;
-estrarre il prezzo unitario di ciascun prodotto in modo da calcolare il prezzo totale.

mi era stato suggerito di passare un puntatore alla mappa globale, ovvero map<int, Prodotto*> prodotti ai tavoli in modo che ogni tavolo condivide con la sala un puntatore alla mappa. Solo che ho difficolta ad implementare questa cosa: qualcuno riesce a suggerirmi qualcosa??

grazie e spero di esser stato sufficientemente chiaro

6 Risposte

  • Re: Confronto tra due map contenute in classi diverse

    Il tavolo è il consumatore, la Sala è il gestore dei consumatori. La richiesta di un prodotto va fatto al Magazzino; il Tavolo non deve sapere niente se il podotto esiste per la quantità richiesta. La sala deve contenere i Tavoli e smistare le richieste al magazzino. Chi è che gestisce le due cose? Il camariere, ovvero quello che fa l'ordinazione. Quindi la tua soluzione senza giocare coi puntatori (e già qui c'è ne da parlare per ore visto che ne hai usati un pò) è quella di creare una classe magazzino scollegato dalla Sala (la quale non deve sapere lo stato del magazzino se non quando fà richieste) e di creare una altra classe chiamiamola Ristorante che include e gestisce tutte ste classi. Una richiesta può essere fatta del tipo:

    Il tavolo fa richiesta di un prodotto, l'ordinazione passa dalla Sala per arrivare al Ristorante il quale chiede al magazzino se il prodotto c'è, e se non c'è il camariere va al tavolo per dire che il prodotto è esaurito. te lo sto spiegando come se fosse un film ma in realtà questo è ciò che devi fare. Il Ristorante deve avere una lista di ordinazioni e prima di concluderli deve vedere se il magazzino riesce a gestire l'ordinazione specifica.
    Tenendo un puntatore del magazzino (ovvero della mappa prodotti) come public al tavolo è come se i clienti avessero libero accesso al magazzino. Ti sembra una cosa sensata?
  • Re: Confronto tra due map contenute in classi diverse

    In pocche parole:
    Il tavolo fa l'ordine (ti si è accesa la lampadina?), quindi classe ordine come public nel tavolo oppure un get/set e membro ordine come privato sempre nel tavolo.
    Classe Sala ha un vettore di tavoli (quindi può vedere anche l'ordine)
    Classe Ristorante ha un membro Sala (e quindi può vedere gli ordini)
    Classe Ristorante ha un membro magazzino dove può vedere se il prodotto c'è.

    Torna la ritroso per notificare lo statto del prodotto se questo manca.
    Ristorante guarda in magazzino e notifica la sala che notifica il tavolo in questione che il prodotto è esaurito.
  • Re: Confronto tra due map contenute in classi diverse

    Sisi ora mi si è accesa la lampadina!! effettivamente mi ero fossilizzato troppo su come avevo impostato io il progetto senza pensare che avrei potuto gestire tutto diversamente. Basti pensare che alla fine un magazzino effettivamente non è altro che un contenitore di prodotti.

    ma quando dici che la classe Ristorante ha come membro Magazzino, intenti l'ereditarietà tra classi?

    ovvero:

    class magazzino: public ristorante{
    ....
    ----
    };
  • Re: Confronto tra due map contenute in classi diverse

    No intendo:
    
    class Ristorante
    {
    ......
    CMagazzino m_magazzino;
    }
    
  • Re: Confronto tra due map contenute in classi diverse

    Ma cosi facendo non dovrei sempre caricare il contenuto del magazzino ogni qual volta devo fare un ordinazione??

    perche la mia intenzione era quella di avere una classe magazzino del tipo:

    class magazzino{
    map<int, prodotto*>prodotti;

    void loadmagazzino(); //carico i dati presi da file txt

    };

    dove Prodotto è quella classe che ho scritto nel messaggio di apertura del topic
  • Re: Confronto tra due map contenute in classi diverse

    Quanti ristoranti hai? Se ne hai uno solo, solo un istanza della classe Ristorante esiste e quindi solo una istanza della classe magazino esiste.
Devi accedere o registrarti per scrivere nel forum
6 risposte