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 Goethe

    Salvo errore et omissione

    Gruß
    rustyoldguy


  • Mod

    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...


  • Mod

    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.


Anmelden zum Antworten