Lagerverwaltung: Verweis auf ein Objekt in einer anderen Klasse



  • Hallo,

    aktuell bearbeite ich Altklausuren für meine Prüfung im Februar und hänge bereits an der Klassenkonzeption.
    Die Aufgabenstellung: Screenshot von der Aufgabe

    Klasse: Produkt

    class Produkt
    {
    private:
    	std::string artikel{};
    	std::string verpackungseinheit{};
    	double preis{};
    	
    public:
    	Produkt(std::string artikel, std::string verpackungseinheit, double preis);
    	void setProdukt(std::string artikel, std::string verpackungseinheit, double preis);
    	std::string getProdukt();
    	double getProdukt1();
    
    
    
    };
    

    Produkt Konstruktor

    Produkt::Produkt(std::string a, std::string b, double c):artikel(a), verpackungseinheit(b), preis(c) {}
    
    void Produkt::setProdukt(std::string a, std::string b, double c) {
    
    	artikel = a;
    	verpackungseinheit = b;
    	preis = c;
    }
    
    std::string Produkt::getProdukt() {
    
    	return artikel + " " + verpackungseinheit + " ";
    
    }
    
    double Produkt::getProdukt1() {
    
    	return preis;
    }
    

    Klasse: Lagerplatz

    class Lagerplatz : public Produkt
    
    {
    private:
    	int anzahl{};
    	const Produkt& prod;
    
    public:
    	Lagerplatz(Produkt*,int );
    	void set_anzahl( int anzahl );
    	int get_anzahl();
    
    
    };
    

    Lagerplatz Konstruktor

    Lagerplatz::Lagerplatz(Produkt& a, int b) : prod(a), anzahl(b) {}
    
    void Lagerplatz::set_anzahl(int x) {
    
    	anzahl = x;
    	x = 100; 
    
    }
    
    int Lagerplatz::get_anzahl() {
    
    	return anzahl;
    }
    

    main

    int main() {
    
    	Produkt p1("Stahlschrauben M6", "100er Paket", 7.95);
    	
    	std::cout << "Produkt: " << p1.getProdukt() << p1.getProdukt1() << std::endl;
    
    }
    
    

    Normalerweise hänge ich nicht an Klassen, jedoch komme ich hier nicht voran und war bereits im offenen Labor, wo einem eigentlich geholfen wird.
    Explizit geht es mir um die Klasse "Lagerplatz" und "Lagerverwaltung". Wie könnte da ein brauchbarer Syntax aussehen?



  • Du hängst also mal wieder ...



  • @manni66
    ich mache ja mehr als eine Altklausur, bin auch mit mehreren schon durch, aber bei der hier komme ich nicht weiter. Zumindest die Klassen irritieren mich, die restlichen Aufgaben der Klausur schaffe ich dann auch alleine



  • Wieso hast du Lagerplatz von Produkt abgeleitet?

    Und wo genau hast du Probleme beim Aufbau der Klasse Lagerverwaltung?



  • @Th69 anfangs dachte ich, dass es Sinn macht es abzuleiten, da ich ja auf das Produkt, bzw. auf dem inhalt vom Produkt zugreifen muss.
    Mittlerweile habe ich es abgeändert und denke, dass ich damit gut fahre:

    class Lagerplatz 
    
    {
    private:
    	int anzahl{};
    	const Produkt* prod;
    
    public:
    	Lagerplatz(Produkt,int );
    	void set_anzahl( int anzahl );
    	int get_anzahl();
    
    
    };
    
    ```cpp
    Lagerplatz::Lagerplatz(Produkt a, int b)  {
    	prod = &a;
    	
    	anzahl = b;
    
    }
    
    void Lagerplatz::set_anzahl(int x) {
    
    	anzahl = x;
    }
    
    int Lagerplatz::get_anzahl() {
    
    	return anzahl;
    }
    

    Mein Problem bei der Lagerverwaltung ist, dass ich überlegt habe einen Container, in Form eines Vectors für die Lagerplätze anzulegen.
    Soweit so gut, dachte ich mir ich lege eine Methode für den vector an.

    class Lagerverwaltung
    {
    
    private:
    	char regal{};
    	int fach{};
    	std::vector<Lagerplatz> lager{};
    
    public:
    	Lagerverwaltung(char regal, int fach, std::vector<Lagerplatz> lager );
    	void addplatz(Lagerplatz xe);
    };
    
    Lagerverwaltung::Lagerverwaltung(char a, int b, std::vector<Lagerplatz> e) : regal(a), fach(b), lager(e) {}
    
    void Lagerverwaltung::addplatz(Lagerplatz xe) {
    
    		lager.push_back(xe);
    
    }
    

    Wie lege ich jetzt richtig die Lagerplätze in dem Container ab?



  • Nicht die Lagerverwaltung hat ein Regal und Fach, sondern das Lager besteht aus Regalen und Fächern von Lagerplätzen.
    Du hast jetzt mehrere Möglichkeiten (wie auch im Aufgabentext angedeutet):

    • entweder ein linearer vector<Lagerplatz>, wo du selber die Regale und Fächer verwaltest (26 * 8 = 208 Elemente)
    • ein vector<vector<Lagerplatz>>, der 26 Regale à 8 Fächer enthält
    • alternativ ein in der Größe konstantes 2D-Array mit 26x8 Elementen: Lagerplatz[26][8]

    Da du schon die 1. Möglichkeit bei dir im Code hast, bleibe dann dabei - mittels resize (bzw. gleich im Konstruktor) kannst du die Größe auf 208 festlegen.
    Der Lagerverwaltung-Konstruktor sollte jedoch keine Parameter haben (als Zusatzaufgabe könntest du die Größe hier angeben), denn das Lager verwaltet es ja selber.
    Und bei der Funktion addplatz (bzw. besser wäre 'addProduct') solltest du Fach, Regal und Produkt (und evtl. noch die Anzahl) als Parameter übergeben. Und statt push_back(welches ja neue Objekte anlegt), sollte es dann per Index-Operator (aus Regal und Fach berechnet) auf den Lagerplatz zugreifen und das Produkt setzen.



  • @Th69

    Ich denke es wäre sogar einfacher mit mehrdimensionalen Arrays zu arbeiten.
    Nehmen wir an meine Lagerverwaltung ist so aufgebaut:
    1
    2
    3
    4
    5
    A B C D E F ....

    Muss mein Array so aussehen: Lagerplatz [10][26], richtig?
    10, da ich zahlen von 0-9 darstellen möchte und 26 für die Buchstaben

    Die Methode "einlagern", die gefordert wird, beinhaltet auch die Aufgabe, die du mit Fach, Regal und Produkt gefordert hast.
    Die Methode schreibe ich als public-Attribut in meine Lagerverwaltungsklasse und definiere die Methode in der .cpp von Lagerverwaltung, richtig?
    Wenn ich allerdings erst das Produkt-Objekt in der Main erzeuge, wie kann ich dann sicherstellen, dass das erzeugte Lager, die Werte vom Produkt erfolgreich übernimmt?



  • In der Aufgabenstellung stand "Fächer von 1 bis 8", daher habe ich 8 geschrieben, aber wenn du 10 haben möchtest, ist das ja auch so OK.

    Und bei der Lagerplatz-Klasse solltest du dann noch eine setProduct-Funktion erzeugen.

    PS:

    Lagerplatz::Lagerplatz(Produkt a, int b)  {
    	prod = &a;
    }
    

    Dies erzeugt einen sog. "dangling pointer", da du die Adresse von dem Parameter (welches eine Kopie des übergebenen Arguments hier ist) speicherst.
    Am besten, du benutzt hier generell nur Wertetypen ("value types") und keine Zeiger (denn die Klasse Produkt so wie du sie oben hast, ist ja einfach kopierbar).