Fehlercodes inC++ Bitte um Hilfestellung
-
Grüß dich inforc1!
Aller Anfang ist schwer!
Hier ein Vorschlag:#include<iostream> using namespace std; // neue Klasse Getraenke class Getraenke { // Die Methoden public: Getraenke(void); // Konstruktor ~Getraenke(); // Destruktor int auswahl; int anzahl; //die Attribute string getraenkeNamen[3]; int restlicheFlaschen[3]; float preisProFlasche[3]; void namenWaehlen(void); // alt war int void uebrigeFlaschen(void); void kostenFlasche (void); }; int main() { Getraenke durst; cout << "Testtrunk" << endl; durst.namenWaehlen(); if ((durst.auswahl >= 0) && (durst.auswahl <= 2)) { durst.uebrigeFlaschen(); durst.kostenFlasche(); } else cout << "Fehler Markenauswahl, Programmende" << endl; return 0; } Getraenke::Getraenke(void) { // Die Namen eintragen getraenkeNamen[0]="Fanta "; getraenkeNamen[1]="Bonaqua "; getraenkeNamen[2]="Bitburger"; // die restlichen Flaschen // auswahl = 0; anzahl = 0; restlicheFlaschen[0]=10; restlicheFlaschen[1]=10; restlicheFlaschen[2]=10; restlicheFlaschen[0]= restlicheFlaschen[0]-anzahl; restlicheFlaschen[1]= restlicheFlaschen[1]-anzahl; restlicheFlaschen[2]= restlicheFlaschen[2]-anzahl; // Der Preis pro Flasche preisProFlasche[0]=1.50; //"Euro"; preisProFlasche[1]=1.75; //"Euro"; preisProFlasche[2]=2.00; //"Euro"; } Getraenke::~Getraenke(){}; //Destruktor; void Getraenke::namenWaehlen(void) { int index; //Die Auswahl cout<<"Bitte waehlen Sie einen Namen: "<<endl; cout<<"Es gibt folgende Auswahl: "<<endl; cout.precision(2); for (index =0; index < 3; index++) cout<< index+1 << "=" << getraenkeNamen[index] << " Preis: " <<fixed <<preisProFlasche[index] << endl; cout<<"Geben Sie ihre gewuenschte Nummer ein: "; cin >> auswahl; cout << endl; auswahl -= 1; if ((auswahl < 0) || (auswahl > 2)) cout << "Falsche Auswahl der Marke"; else { cout<<"Gewunschte Anzahl: "; cin >> anzahl; } } void Getraenke::uebrigeFlaschen(void) { // restliche Flaschen ausgeben //int auswahl; cout << "Ihre Wahl: " << anzahl<< " Flaschen Marke"; cout << getraenkeNamen[auswahl] << " Preis: " <<preisProFlasche[auswahl] << endl; if ((restlicheFlaschen[auswahl]) < anzahl) { cout<< "Es sind leider nicht mehr genuegend Flaschen im Getraenke-"<< endl << "automaten vorhanden:" << endl; cout<< "Restmenge: " << restlicheFlaschen[auswahl] <<"... bitte anderes Getraenk waehlen"<< endl; } else { restlicheFlaschen[auswahl] -= anzahl; cout << "Verbleibende Menge: " << restlicheFlaschen[auswahl] << endl; } } void Getraenke::kostenFlasche(void) { cout<<"Preis pro Flasche: "<< preisProFlasche[auswahl] <<" Euro"<<endl; cout.precision(2); cout<<"Gesamtpreis: " << preisProFlasche[auswahl] * anzahl << "Euro" <<endl; }
Du hast den Destruktor vergessen!
Packe lieber Variablen und Arrays, die nur von der Klasse benötigt werden,
in die Klasse rein. Eventuell verzettelst du dich sonst bei größeren
Programmen mit den globalen Variablen.
Bei der Definiton und der Deklaration des Konstrukors und des Destruktors
sind keine "Rückgabetypen" erlaubt. Auch nicht void;Und lass dir eines sagen:
"Fehlen kann ein jeder, doch wie einer seines Fehlens Folgen trägt,
unterscheidet den reinen vom gemeinen Geiste"!
Johann Wolfgang von GoetheSalvo errore et omissione
Gruß
rustyoldguy
-
rustyoldguy schrieb:
Du hast den Destruktor vergessen!
Erklär mal den Sinn deines leeren Destruktors. Gibt keinen, oder?
-
hustbaer schrieb:
Ich zeig dir wie du das rausfindest, anhand eines Beispiels. Den Rest machst du dann selbst.
[...]Macht mich immer glücklich, wenn ich solche Posts sehe. Echt jetzt
-
Hi!
Der Destruktor ist das Gegenstück zum Konstruktor. Er hat die Aufgabe, die
Initialisierung des Konstruktors zurück zu nehmen, welche mit der
automatischen Auflösung des Speicherbereichs nicht erledigt sind.
Er wird also GEGEBENENFALLS
automatisch aufgerufen, zwar nicht beim Beginn, sondern am Ende der
"Lebenszeit" eines Objekts, etwa beim Rücksprung aus einer Funktion, die
ein Objekt als lokale Variable definiert.
Sein Zweck sind quasi ausschließlich Aufräumarbeiten, wie die
Freigabe von dynamisch belegten Speicherbereichen.dadurch, gegebenenfalls
etwa für das schließen oder entsperren von Dateien.Wenn ein Datenelement selbst ein Objekt einer Klasse ist, wird auch
dessen Destruktor aufgerufen. Wenn z.B. ein mit new angelegte Objekt
(dynamisch belegter Speicher) mit delete wieder gelöscht wird,
beim Verlassen eines Funktionsblocks, in dem Lokale Objekte
definiert wurden.Ob ein Destruktor für eine Klasse definiert werden muß oder nicht,
hängt von den jeweiligen Anforederungen ab. Für Objekte welche über ihren
Konstruktor oder eine andere Methode selbständig dynamischen Speicherplatz
belegen, ist ein Destruktor fur Freigabe dieser Bereiche eine unbedingte
Vorraussetzung.
Destruktoren sind nicht überladbar und können keine Parameter
übernehmen und besitz auch keinen Ergebnistyp.Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,
viele Compiler geben eine Fehlermeldung raus, wenn er fehlt. Außerdem
spart man sich bei späteren Änderungen Tipparbeit.
-
rustyoldguy schrieb:
Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,
Wozu?!?!
viele Compiler geben eine Fehlermeldung raus, wenn er fehlt.
Dann ist der Compiler kaputt.
-
HarteWare schrieb:
hustbaer schrieb:
Ich zeig dir wie du das rausfindest, anhand eines Beispiels. Den Rest machst du dann selbst.
[...]Macht mich immer glücklich, wenn ich solche Posts sehe. Echt jetzt
Ich hab keine Ahnung ob das Sarkasmus/Zynismus sein soll oder nicht. Echt jetzt.
ps: Nach Lesen einiger deiner anderen Beitrage nehme ich an du meinst es Ernst. OK. Dann danke War mir nur auf Grund der Formulierung grad nicht sicher.
-
rustyoldguy schrieb:
Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,
Ich sage das ist kompletter Unfug. Kannst du diese deine Meinung denn auch irgendwie begründen?
rustyoldguy schrieb:
viele Compiler geben eine Fehlermeldung raus, wenn er fehlt.
Das ist einfach nur falsch.
rustyoldguy schrieb:
Außerdem spart man sich bei späteren Änderungen Tipparbeit.
WTF?
-
hustbaer schrieb:
rustyoldguy schrieb:
Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,
Ich sage das ist kompletter Unfug. Kannst du diese deine Meinung denn auch irgendwie begründen?
Das ist nicht nur Unfug, sondern sogar gefährlicher Unfug...
-
dot schrieb:
hustbaer schrieb:
rustyoldguy schrieb:
Der Destruktor sollte aber trotzdem, auch wenn er leer ist, drin stehen,
Ich sage das ist kompletter Unfug. Kannst du diese deine Meinung denn auch irgendwie begründen?
Das ist nicht nur Unfug, sondern sogar gefährlicher Unfug...
Nein, der Unfug ist nicht gefährlich, sondern VC++.
-
Unfug, der auf einem der am weitesten verbreiteten Compiler zu unnötig ineffizientem Code führt, würde ich als gefährlichen Unfug einstufen...
-
Ums nochmal explizit zu sagen, der Compiler generiert implizit einen default destructor, wenn der user keinen definiert. Oder so ähnlich.
@hustbaer, ja war ernst gemeint, da gibts son Sprichwort, mit gib nem Mann nen Fisch und ernähre ihn für einen Tag, bring ihm bei zu Fischen und ernähre ihn sein ganzes Leben lang, oder so ähnlich. Das lässt sich auf die selbstständige Fehlerbehebung auch irgendwie übertragen.