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 AufgabeKlasse: 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
vonProdukt
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.
DerLagerverwaltung
-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 Funktionaddplatz
(bzw. besser wäre 'addProduct') solltest du Fach, Regal und Produkt (und evtl. noch die Anzahl) als Parameter übergeben. Und stattpush_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.
- entweder ein linearer
-
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 BuchstabenDie 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 einesetProduct
-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 KlasseProdukt
so wie du sie oben hast, ist ja einfach kopierbar).