Klasse erzeugen
-
Hi Leute ich habe ein Problem (Informatikanfänger),ich muß eine Klasse (getraenk)in ein bestehendes Programm einbringen .Ich habe schon mehere ansätze Probiert aber anscheinend verstehe ich es nicht bei mir läuft der Getränkeautomat auch ohne class Getraenk wenn mir einer helfen könnte wäre echt toll
/* ##################################
Der Getränkeautomat
###################################*/#include <iostream>
#include <cmath>
using namespace std;
// klasse getraenk
class Getraenk {string name;
int preis;
int anzahlFlaschen;public:
//Methoden:
void setName(string a_name) {name = a_name;}
void setPreis(int a_preis) {preis = a_preis;}
void setAnzahl(int a_anzahl) {anzahlFlaschen = a_anzahl;}string getName() { return name;}
int getPreis() { return preis;}
int getAnzahl() { return anzahlFlaschen; }// Konstruktor
Getraenk( string a_name, int a_preis, int a_anzahlFlaschen )
: name(a_name), preis(a_preis), anzahlFlaschen(a_anzahlFlaschen) {}
};//die Vereinbarung der Klasse muenzeinheit
class muenzeinheit
{
//die Attribute
int betrag;
int nochZuZahlen;
int rueckgeld;//die Methoden
public:
//der Konstruktor
muenzeinheit();
//der Destruktor
~muenzeinheit();
void muenzenAnnehmen(int wert);
int rueckgeldGeben();
//zum Setzen des Betrags
void setBetrag(int preis);
//zum Abfragen des noch zu zahlenden Betrags
int getnochZuZahlen();
};muenzeinheit::muenzeinheit() {
betrag = 0;
nochZuZahlen = 0;
rueckgeld = 0;
}muenzeinheit::~muenzeinheit() {
cout << "Eine Instanz der Klasse muenzeinheit wurde zerstoert." << endl;
}void muenzeinheit::muenzenAnnehmen(int wert) {
//den eingeworfenen Betrag abziehen
nochZuZahlen = nochZuZahlen - wert;
}int muenzeinheit::rueckgeldGeben() {
//den absoluten Betrag von nochZuZahlen als Rückgeld liefern
rueckgeld = abs(nochZuZahlen);
return rueckgeld;
}void muenzeinheit::setBetrag(int preis) {
betrag = preis;
nochZuZahlen = betrag;
}int muenzeinheit::getnochZuZahlen() {
return nochZuZahlen;
}//die Vereinbarung der Klasse getraenkeautomat
class getraenkeautomat
{
//die Attribute
string getraenk[3];
int anzahlFlaschen[3];
bool kuehlung;//jetzt ist die Münzeinheit Teil des Getränkeautomaten
muenzeinheit *zahlomat;public:
//die Methoden
//der Konstruktor
//übergeben werden drei int-Typen für die Anzahl und ein Zeiger auf die Klasse muenzeinheit
getraenkeautomat(int anzahl1, int anzahl2, int anzahl3, muenzeinheit *tempZahlomat);
//der Destruktor
~getraenkeautomat();
int getraenkeWaehlen();
void getraenkAusgeben(int anzahl, int getraenkeIndex);
void kuehlen(bool anaus);
};getraenkeautomat::getraenkeautomat(int anzahl1, int anzahl2, int anzahl3, muenzeinheit *tempZahlomat)
{//die Getränke eintragen
getraenk[0] = "Limonade";
getraenk[1] = "Wasser";
getraenk[2] = "Bier";//die Anzahl der Flaschen
//Sie werden jetzt durch die Argumente gesetzt
anzahlFlaschen[0] = anzahl1;
anzahlFlaschen[1] = anzahl2;
anzahlFlaschen[2] = anzahl3;//die Kühlung ist aus
kuehlung = false;//die Instanz der Münzeinheit wird zugewiesen
zahlomat = tempZahlomat;
}getraenkeautomat::~getraenkeautomat() {
cout << "Eine Instanz der Klasse getraenkeautomat wurde zerstoert." << endl; }int getraenkeautomat::getraenkeWaehlen() {
int auswahl, anzahl;
//die Auswahl
cout << "Bitte waehlen Sie ein Getraenk: " << endl;
cout << "Es gibt folgende Auswahl: " << endl;for (int index = 0; index < 3; index++)
cout << index+1 << " - " << getraenk[index] << endl;
cout << "Geben Sie die gewuenschte Nummer ein: ";
cin >> auswahl;//gibt es noch Flaschen vom gewählten Getränk
if (anzahlFlaschen[auswahl-1] > 0)
{
//das Getränk ausgeben
cout << "Wie viele Flaschen moechten Sie? ";
cin >> anzahl;//erst muss bezahlt werden
//der Preis 10 ist fest vorgegeben
cout << "Sie muessen " << anzahl * 10 << " Cent bezahlen." << endl;
zahlomat->setBetrag(anzahl * 10);do {
cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl;
zahlomat->muenzenAnnehmen(10);
} while (zahlomat->getnochZuZahlen() >0);//das Getränk ausgeben
auswahl = auswahl - 1;
getraenkAusgeben(anzahl, auswahl);
}
else {
cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl;
auswahl = -1;
}
return auswahl;
}void getraenkeautomat::getraenkAusgeben(int anzahl, int getraenkeIndex)
{
//gibt es noch genügend Flaschen?
if (anzahl <= anzahlFlaschen[getraenkeIndex])
{
cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenk[getraenkeIndex] << endl;
anzahlFlaschen[getraenkeIndex] = anzahlFlaschen[getraenkeIndex] - anzahl;
cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << "Cent zurueck." << endl;
}
else
{
cout << "Es sind nur noch " << anzahlFlaschen[getraenkeIndex] << " Flasche(n) " << getraenk[getraenkeIndex] << " vorhanden. ";
cout << "Sie erhalten den Rest." << endl;//Geld zurückgeben
cout << "Sie erhalten " << zahlomat->rueckgeldGeben() + (anzahl - anzahlFlaschen[getraenkeIndex]) * 10 << " Cent zurueck." << endl;
anzahlFlaschen[getraenkeIndex] = 0;
}
}void getraenkeautomat::kuehlen(bool anaus)
{
if (anaus == true)
{
kuehlung = true;
cout << "Die Kuehlung ist eingeschaltet. " << endl;
}
else
{
kuehlung = false;
cout << "Die Kuehlung ist ausgeschaltet. " << endl;
}
}int main()
{
int auswahl;//Instanz erzeugen
//der Zeiger auf die Klasse
getraenkeautomat *automat;//die Münzeinheit erzeugen
muenzeinheit *einheit = new muenzeinheit();//die Münzeinheit wird jetzt übergeben
automat = new getraenkeautomat(10, 20, 30, einheit);//ein Getränk auswähle
do
{
automat->kuehlen(true);auswahl = automat->getraenkeWaehlen();
}
while (auswahl == -1);automat->kuehlen(false);
//die Instanzen freigeben
delete (einheit);
delete (automat);return 0;
}
-
Den Code bitte in Tags.
Hier stehts wie es geht: http://www.c-plusplus.net/forum/304133
-
pietro d76 schrieb:
Probiert aber anscheinend verstehe ich es nicht bei mir läuft der Getränkeautomat auch ohne class Getraenk
Weil er einen string für Getränke benutzt. Deine Getränkeklasse wird nirgendwo angepackt.
wenn mir einer helfen könnte wäre echt toll
Was ist deine Frage? Du willst sicher mehr, als dass dich jemand darauf aufmerksam macht, dass der Automat einen string benutzt.
-
pietro d76 schrieb:
Ich habe schon mehere ansätze Probiert
welche
-
Tschuldigung bin neu hier ich wollte euch nur zeigen das ich auch dran arbeite und es nicht nur von euch lösen lassen will.Zu genauerer Verständnis des problems
die Attribute für Getränke durch Instanzen der Klasse Getränk.
die klasse getraenk habe ich schon erstellt
class Getraenk {string name;
int preis;
int anzahlFlaschen;public:
//Methoden:
void setName(string a_name) {name = a_name;}
void setPreis(int a_preis) {preis = a_preis;}
void setAnzahl(int a_anzahl) {anzahlFlaschen = a_anzahl;}string getName() { return name;}
int getPreis() { return preis;}
int getAnzahl() { return anzahlFlaschen; }// Konstruktor
Getraenk( string a_name, int a_preis, int a_anzahlFlaschen )
: name(a_name), preis(a_preis), anzahlFlaschen(a_anzahlFlaschen) {}
};
-
#include <iostream> #include <cmath> using namespace std; class Getraenk { string name; int preis; int anzahlFlaschen; public: void setName(string a_name) {name = a_name;} void setPreis(int a_preis) {preis = a_preis;} void setAnzahl(int a_anzahl) {anzahlFlaschen = a_anzahl;} string getName() { return name;} int getPreis() { return preis;} int getAnzahl() { return anzahlFlaschen; } Getraenk(){} Getraenk( string a_name, int a_preis, int a_anzahlFlaschen ) : name(a_name), preis(a_preis), anzahlFlaschen(a_anzahlFlaschen) {} }; class muenzeinheit { int betrag; int nochZuZahlen; int rueckgeld; public: muenzeinheit() : betrag(0), nochZuZahlen(0), rueckgeld(0){} ~muenzeinheit(); void muenzenAnnehmen(int wert); int rueckgeldGeben(); void setBetrag(int preis); int getnochZuZahlen(); }; muenzeinheit::~muenzeinheit() { cout << "Eine Instanz der Klasse muenzeinheit wurde zerstoert." << endl; } void muenzeinheit::muenzenAnnehmen(int wert) { nochZuZahlen = nochZuZahlen - wert; } int muenzeinheit::rueckgeldGeben() { rueckgeld = abs(nochZuZahlen); return rueckgeld; } void muenzeinheit::setBetrag(int preis) { betrag = preis; nochZuZahlen = betrag; } int muenzeinheit::getnochZuZahlen() { return nochZuZahlen; } class getraenkeautomat { Getraenk getraenke[3]; bool kuehlung; muenzeinheit *zahlomat; public: getraenkeautomat(int anzahl1, int anzahl2, int anzahl3, muenzeinheit *tempZahlomat); ~getraenkeautomat(); int getraenkeWaehlen(); void getraenkAusgeben(int anzahl, int getraenkeIndex); void kuehlen(bool anaus); }; getraenkeautomat::getraenkeautomat(int anzahl1, int anzahl2, int anzahl3, muenzeinheit *tempZahlomat) { getraenke[0].setName("Limonade"); getraenke[1].setName("Wasser"); getraenke[2].setName("Bier"); getraenke[0].setAnzahl(anzahl1); getraenke[1].setAnzahl(anzahl2); getraenke[2].setAnzahl(anzahl3); kuehlung = false; zahlomat = tempZahlomat; } getraenkeautomat::~getraenkeautomat() { cout << "Eine Instanz der Klasse getraenkeautomat wurde zerstoert." << endl; } int getraenkeautomat::getraenkeWaehlen() { int auswahl, anzahl; //die Auswahl cout << "Bitte waehlen Sie ein Getraenk: " << endl; cout << "Es gibt folgende Auswahl: " << endl; for (int index = 0; index < 3; index++) cout << index+1 << " - " << getraenke[index].getName() << endl; cout << "Geben Sie die gewuenschte Nummer ein: "; cin >> auswahl; if (getraenke[auswahl-1].getAnzahl() > 0) { cout << "Wie viele Flaschen moechten Sie? "; cin >> anzahl; cout << "Sie muessen " << anzahl * 10 << " Cent bezahlen." << endl; zahlomat->setBetrag(anzahl * 10); do { cout << "Es fehlen noch " << zahlomat->getnochZuZahlen() << " Cent." << endl; zahlomat->muenzenAnnehmen(10); } while (zahlomat->getnochZuZahlen() >0); //das Getränk ausgeben auswahl = auswahl - 1; getraenkAusgeben(anzahl, auswahl); } else { cout << "Das gewaehlte Getraenk ist leider nicht mehr vorhanden." << endl; auswahl = -1; } return auswahl; } void getraenkeautomat::getraenkAusgeben(int anzahl, int getraenkeIndex) { //gibt es noch genügend Flaschen? if (anzahl <= getraenke[getraenkeIndex].getAnzahl()) { cout << "Sie erhalten " << anzahl << " Flasche(n) " << getraenke[getraenkeIndex].getName() << endl; getraenke[getraenkeIndex].setAnzahl(getraenke[getraenkeIndex].getAnzahl() - anzahl); cout << "Sie erhalten " << zahlomat->rueckgeldGeben() << "Cent zurueck." << endl; } else { cout << "Es sind nur noch " << getraenke[getraenkeIndex].getAnzahl() << " Flasche(n) " << getraenke[getraenkeIndex].getName() << " vorhanden. "; cout << "Sie erhalten den Rest." << endl; //Geld zurückgeben cout << "Sie erhalten " << zahlomat->rueckgeldGeben() + (anzahl - getraenke[getraenkeIndex].getAnzahl()) * 10 << " Cent zurueck." << endl; getraenke[getraenkeIndex].setAnzahl(0); } } void getraenkeautomat::kuehlen(bool anaus) { if (anaus == true) { kuehlung = true; cout << "Die Kuehlung ist eingeschaltet. " << endl; } else { kuehlung = false; cout << "Die Kuehlung ist ausgeschaltet. " << endl; } } int main() { int auswahl; //Instanz erzeugen //der Zeiger auf die Klasse getraenkeautomat *automat; //die Münzeinheit erzeugen muenzeinheit *einheit = new muenzeinheit(); //die Münzeinheit wird jetzt übergeben automat = new getraenkeautomat(10, 20, 30, einheit); //ein Getränk auswähle do { automat->kuehlen(true); auswahl = automat->getraenkeWaehlen(); } while (auswahl == -1); automat->kuehlen(false); //die Instanzen freigeben delete (einheit); delete (automat); return 0; }
Damit der Code so aussieht verwende Code Tags.
Ich habe die String Array "getraenk" und die Array "anzahlFlaschen" durch eine Array von der Klasse "Getraenk" ersetzt. Anschließend den Restlichen Code drauf angepasst.
Warum verwendest du manchmal die Initialisierungsliste bei den Konstruktor und manchmal nicht?
Der veränderte Code von mir kann Fehler enthalten.
-
Bashar schrieb:
pietro d76 schrieb:
Ich habe schon mehere ansätze Probiert
welche
Ich habe z.b. versucht einen Zeiger auf die Klasse Getränk zu erzeugen (getraenk *getraenk) im klasse Getränkeautomat aber wenn ich das mache erscheind immer der fehler muenzeinheit nicht declared.
-
Danke Pringles,ich werde deine ansätze ausprobieren wenns klappt melde ich mich!
-
pietro d76 schrieb:
Ich habe z.b. versucht einen Zeiger auf die Klasse Getränk zu erzeugen (getraenk *getraenk) im klasse Getränkeautomat aber wenn ich das mache erscheind immer der fehler muenzeinheit nicht declared.
Der Fehler kann mit dem Getraenk nichts zu tun haben.
-
Bashar schrieb:
pietro d76 schrieb:
Ich habe z.b. versucht einen Zeiger auf die Klasse Getränk zu erzeugen (getraenk *getraenk) im klasse Getränkeautomat aber wenn ich das mache erscheind immer der fehler muenzeinheit nicht declared.
Der Fehler kann mit dem Getraenk nichts zu tun haben.
Ja der meinung bin ich auch aber wenn ich den Zeiger wider entferne läuft es ja wieder.
-
Danke Pringles musste es zwar leicht überarbeiten ; weil der den grössten teil des Programm vorgegeben ist aber es klappt wunderbar nochmals Danke.