Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Fehler bei _obj=NULL;

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
16.12.2016, 19:10 Uhr
~Julia_w
Gast


Hallo,

ich möchte Objekte von der Klasse Motorrad erzeugen. Das klappt auch, inklusive dem initialisieren mit Daten
if(temp=='1') //..wenn Zifferneingabe == 1.

wenn ich aber unter
else if (temp=='2') //... wenn Zifferneingabe == 2
die Objekte wieder mit NULL initialisieren will UND das in einer Willkürlichen Reihenfolge mache, z.B.
"Honda_TransAlp", dann "BMW_F_650_GS" und "Suzuki_Bandit" = NULL stürzt das Programm ab. wenn ich allerdings eine Reihenfolge einhalte , z.B. "Kawasaki_ZZR1400", dann "BMW_F_650_GS" und "Honda_TransAlp" = NULL, dann funktioniert es.
Kann mir das jemand helfen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
16.12.2016, 19:11 Uhr
~Julia_w
Gast



C++:
#include <cstdlib>
#include <iostream>
#include <string>
#include <vector>
#include <stdio.h>
#include <fstream>
#include <string>
using namespace std;

class Reservierung
{
    friend class Motorrad;
private:
    string adresse, motorradname;
    int telefon, gebJahr;

public:
    string name, vorname;
    bool fhrschein_A;
    bool uebergabe;
    Reservierung() {}
    // Konstruktormethode mit Elementinitialisierung
    Reservierung(string motName, string n, string v, string addy, int tele, int born, bool license): motorradname(motName), name(n), vorname(v), adresse(addy), telefon(tele), gebJahr(born), fhrschein_A(license) {}
    Reservierung(string n, string v, string addy, int tele, int born, bool license): name(n), vorname(v), adresse(addy), telefon(tele), gebJahr(born), fhrschein_A(license) {}

    ~Reservierung() {} // Destruktor
};

class Motorrad:public Reservierung
{
private:

public: // Default-Konstruktor
    Motorrad():Reservierung() {}
    // Konstruktormethode mit Elementinitialisierung
    Motorrad(string motName, string n, string v, string addy, int tele, int born, bool license): Reservierung(motName, n, v, addy, tele, born, license) {}
    Motorrad(string n, string v, string addy, int tele, int born, bool license): Reservierung(n, v, addy, tele, born, license) {}

    ~Motorrad() // Destruktor
    {
        cout<<"Reservierung geloescht!"<<endl;   //Löschen der Reservierung, bzw. freigeben des Speichers //virtuelle Funktion muss überschrieben werden
    }
    void datenausgeben() //schreiben des Reservierungsdaten in reservierung.txt
    {
        cout << "Motorrad: " <<motorradname<<": "  <<name << ", " << vorname << ", " << adresse << ", " << telefon << " " << endl;
        cout << "Fuehrerschein Klasse A vorhanden?: " <<fhrschein_A  << endl;
        fstream f;
        f.open("reservierungen.txt", ios::out | ios::app);
        f << "Motorrad: " <<motorradname<<": "  << name << ", " << vorname << ", " << adresse << ", " << telefon << " " << "Fuehrerschein Klasse A vorhanden?: " <<fhrschein_A <<endl << endl;
        f.close();
    }
};

struct Kunde
{
    string name, vorname, adresse;
    int gebJahr, telefon;
    bool fhrschein_A, uebergabe;
};

void eingabe(struct Kunde *zeiger)
{
    cout<<"Nachame eingeben! "<<endl;
    cin>>(*zeiger).name;
    cout<<"Vorname eingeben! "<<endl;
    cin>>(*zeiger).vorname;
    cout<<"Adresse eingeben! "<<endl;
    cin>>(*zeiger).adresse;
    cout<<"Telefonnummer eingeben! (nur Zahlen!)"<<endl;
    cin>>(*zeiger).telefon;
    cout<<"Geburtstag eingeben! [ddmmyy]"<<endl;
    cin>>(*zeiger).gebJahr;
    cout<<"Fuehrerschein Klasse A vorhanden? [ja=1 || nein=0]"<<endl;
    cin>>(*zeiger).fhrschein_A;
}

int main(int argc, char *argv[])
{
    string bikeName[]= {"Suzuki_Bandit", "Honda_TransAlp", "BMW_F_650_GS","Kawasaki_ZZR1400"};
    struct Kunde customer[5];
    char temp;
    Motorrad *Suzuki_Bandit=NULL;
    Motorrad *Honda_TransAlp=NULL;
    Motorrad *BMW_F_650_GS=NULL;
    Motorrad *Kawasaki_ZZR1400=NULL;
    while(1)
    {
        cout<<"Hauptmenue \n"<<" 1 Reservierung vornehmen \n"<<" 2 Motorrad herausgeben \n"<<endl;
        cin>>temp;
        if(temp=='1') //..wenn Zifferneingabe == 1
        {
            cout<<"Fuer die folgenden Motorraeder die zugehoerigen Ziffern eingeben! \n"<<" 1 Suzuki_Bandit \n 2 Honda_TransAlp \n 3 BMW_F_650_GS \n 4 Kawasaki_ZZR1400 \n"<<endl;
            char temp2;
            cin>>temp2;
            if ((temp2=='1')&&(Suzuki_Bandit==NULL))
            {
                eingabe(&customer[1]);
                Suzuki_Bandit=new Motorrad(customer[1].name, customer[1].vorname, customer[1].adresse, customer[1].telefon, customer[1].gebJahr, customer[1].fhrschein_A); //Instanz von Motorrad deklarieren
                Suzuki_Bandit->datenausgeben(); // Aufruf der Funktion datenausgabe()
                if(Suzuki_Bandit->fhrschein_A==false)
                {
                    delete Suzuki_Bandit; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf
                    Suzuki_Bandit=NULL; //Objekt mit NULL initialiesieren, also leer
                    cout<<"Kein gueltiger Fuehrerschein"<<endl;
                }
            }
            else if((temp2=='2')&&(Honda_TransAlp==NULL))
            {
                eingabe(&customer[2]);
                Honda_TransAlp=new Motorrad(customer[2].name, customer[2].vorname, customer[2].adresse, customer[2].telefon, customer[2].gebJahr, customer[2].fhrschein_A); //Instanz von Motorrad deklarieren
                Honda_TransAlp->datenausgeben(); // Aufruf der Funktion datenausgabe()
                if(Honda_TransAlp->fhrschein_A==false)
                {
                    delete Honda_TransAlp; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf
                    Honda_TransAlp=NULL; //Objekt mit NULL initialiesieren, also leer
                    cout<<"Kein gueltiger Fuehrerschein"<<endl;
                }
            }
            else if((temp2=='3')&&(BMW_F_650_GS==NULL))
            {
                eingabe(&customer[3]);
                BMW_F_650_GS=new Motorrad(customer[3].name, customer[3].vorname, customer[3].adresse, customer[3].telefon, customer[3].gebJahr, customer[3].fhrschein_A); //Instanz von Motorrad deklarieren
                BMW_F_650_GS->datenausgeben(); // Aufruf der Funktion datenausgabe()
                if(BMW_F_650_GS->fhrschein_A==false)
                {
                    delete BMW_F_650_GS; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf
                    BMW_F_650_GS=NULL; //Objekt mit NULL initialiesieren, also leer
                    cout<<"Kein gueltiger Fuehrerschein"<<endl;
                }
            }
            else if((temp2=='4')&&(Kawasaki_ZZR1400==NULL))
            {
                eingabe(&customer[4]);
                Kawasaki_ZZR1400=new Motorrad(customer[4].name, customer[4].vorname, customer[4].adresse, customer[4].telefon, customer[4].gebJahr, customer[4].fhrschein_A); //Instanz von Motorrad deklarieren
                Kawasaki_ZZR1400->datenausgeben(); // Aufruf der Funktion datenausgabe()
                if(Kawasaki_ZZR1400->fhrschein_A==false)
                {
                    delete Kawasaki_ZZR1400; // wenn keine Führerscheinklasse A vorliegt, Reservierung löschen durch Destruktoraufruf
                    Kawasaki_ZZR1400=NULL; //Objekt mit NULL initialiesieren, also leer
                    cout<<"Kein gueltiger Fuehrerschein"<<endl;
                }
            }
            else cout<<"gewuenschtes Motorrad bereits reserviert. \n"<<endl;
        }
        else if (temp=='2') //... wenn Zifferneingabe == 2
        {
            cout<<" 2 Motorrad rausgeben \n \n" <<endl;
            string temp3, temp4;
            cout<<"Vorname eingeben \n"<<endl;
            cin>>temp3;
            cout<<"Nachname eingeben \n"<<endl;
            cin>>temp4;
            if ((temp3==Suzuki_Bandit->vorname) && (temp4==Suzuki_Bandit->name)) //...wenn eingegebener Vorname UND Nachname gleich der Motorrad.name UND Motorrad.vorname
            {
               Suzuki_Bandit->uebergabe=true;
               Suzuki_Bandit=NULL; //Objekt mit NULL initialiesieren, also leer
               cout<<"Reservierung Suzuki_Bandit geloescht und Motorrad rausgegeben. \n"<<endl;// Reservierung löschen durch Destruktoraufruf
            //delete Suzuki_Bandit;  //Reservierung löschen durch Destruktoraufruf
            }
            else if ((temp3==Honda_TransAlp->vorname) && (temp4==Honda_TransAlp->name)) //...wenn eingegebener Vorname UND Nachname gleich der Motorrad.name UND Motorrad.vorname
            {
                Honda_TransAlp->uebergabe=true;
                Honda_TransAlp=NULL; //Objekt mit NULL initialiesieren, also leer
                cout<<"Reservierung Honda_TransAlp geloescht und Motorrad rausgegeben. \n"<<endl; // Reservierung löschen durch Destruktoraufruf
           //delete Honda_TransAlp; //Reservierung löschen durch Destruktoraufruf
            }
            else if ((temp3==BMW_F_650_GS->vorname) && (temp4==BMW_F_650_GS->name)) //...wenn eingegebener Vorname UND Nachname gleich der Motorrad.name UND Motorrad.vorname
            {
               BMW_F_650_GS->uebergabe=true;
               BMW_F_650_GS=NULL; //Objekt mit NULL initialiesieren, also leer
               cout<<"Reservierung BMW_F_650_GS geloescht und Motorrad rausgegeben. \n"<<endl;//  Reservierung löschen durch Destruktoraufruf
           //delete BMW_F_650_GS; //Reservierung löschen durch Destruktoraufruf
            }
            else if ((temp3==Kawasaki_ZZR1400->vorname) && (temp4==Kawasaki_ZZR1400->name)) //...wenn eingegebener Vorname UND Nachname gleich der Motorrad.name UND Motorrad.vorname
            {
                Kawasaki_ZZR1400->uebergabe=true;
                Kawasaki_ZZR1400=NULL; //Objekt mit NULL initialiesieren, also leer
                cout<<"Reservierung Kawasaki_ZZR1400 geloescht und Motorrad rausgegeben. \n"<<endl;// Reservierung löschen durch Destruktoraufruf
           //delete Kawasaki_ZZR1400; //Reservierung löschen durch Destruktoraufruf
            }
            else cout<<"Keine Uebereinstimmung von eingegebenen Namen und Reservierung. \n "<<endl;
        }
    }
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.12.2016, 21:10 Uhr
~Julia_w
Gast


ich konnte den Fehler soweit eingrenzen, das selbst bei der Eingabe eines falschen temp3 und temp4, NICHT die
else cout<<"Keine Uebereinstimmung von eingegebenen Namen und Reservierung.
anspringt. Also liegt der Fehler beim Vergleich der if...else if-Bedingungen. Weiter komme ich aber nicht.

C++:
            if ((temp3==Suzuki_Bandit->vorname) && (temp4==Suzuki_Bandit->name)) //...wenn eingegebener Vorname UND Nachname gleich der Motorrad.name UND Motorrad.vorname
            {
               Suzuki_Bandit->uebergabe=true;
               Suzuki_Bandit=NULL; //Objekt mit NULL initialiesieren, also leer
               cout<<"Reservierung Suzuki_Bandit geloescht und Motorrad rausgegeben. \n"<<endl;// Reservierung löschen durch Destruktoraufruf
               delete Suzuki_Bandit;  //Reservierung löschen durch Destruktoraufruf
            }
            else if ((temp3==Honda_TransAlp->vorname) && (temp4==Honda_TransAlp->name)) //...wenn eingegebener Vorname UND Nachname gleich der Motorrad.name UND Motorrad.vorname
            {
                Honda_TransAlp->uebergabe=true;
                Honda_TransAlp=NULL; //Objekt mit NULL initialiesieren, also leer
                cout<<"Reservierung Honda_TransAlp geloescht und Motorrad rausgegeben. \n"<<endl; // Reservierung löschen durch Destruktoraufruf
                delete Honda_TransAlp; //Reservierung löschen durch Destruktoraufruf
            }
            else if ((temp3==BMW_F_650_GS->vorname) && (temp4==BMW_F_650_GS->name)) //...wenn eingegebener Vorname UND Nachname gleich der Motorrad.name UND Motorrad.vorname
            {
               BMW_F_650_GS->uebergabe=true;
               BMW_F_650_GS=NULL; //Objekt mit NULL initialiesieren, also leer
               cout<<"Reservierung BMW_F_650_GS geloescht und Motorrad rausgegeben. \n"<<endl;//  Reservierung löschen durch Destruktoraufruf
               delete BMW_F_650_GS; //Reservierung löschen durch Destruktoraufruf
            }
            else if ((temp3==Kawasaki_ZZR1400->vorname) && (temp4==Kawasaki_ZZR1400->name)) //...wenn eingegebener Vorname UND Nachname gleich der Motorrad.name UND Motorrad.vorname
            {
                Kawasaki_ZZR1400->uebergabe=true;
                Kawasaki_ZZR1400=NULL; //Objekt mit NULL initialiesieren, also leer
                cout<<"Reservierung Kawasaki_ZZR1400 geloescht und Motorrad rausgegeben. \n"<<endl;// Reservierung löschen durch Destruktoraufruf
                delete Kawasaki_ZZR1400; //Reservierung löschen durch Destruktoraufruf
            }
            else cout<<"Keine Uebereinstimmung von eingegebenen Namen und Reservierung. "<<endl;

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.12.2016, 01:07 Uhr
~somebody
Gast


Sorry, will eigentlich niemand lesen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.12.2016, 13:04 Uhr
ao

(Operator)



Zitat von ~Julia_w:
Hallo,

ich möchte Objekte von der Klasse Motorrad erzeugen. Das klappt auch, inklusive dem initialisieren mit Daten
if(temp=='1') //..wenn Zifferneingabe == 1.

wenn ich aber unter
else if (temp=='2') //... wenn Zifferneingabe == 2
die Objekte wieder mit NULL initialisieren will UND das in einer Willkürlichen Reihenfolge mache, z.B.
"Honda_TransAlp", dann "BMW_F_650_GS" und "Suzuki_Bandit" = NULL stürzt das Programm ab. wenn ich allerdings eine Reihenfolge einhalte , z.B. "Kawasaki_ZZR1400", dann "BMW_F_650_GS" und "Honda_TransAlp" = NULL, dann funktioniert es.
Kann mir das jemand helfen?

Das liegt daran, dass du in der if-else-if-Kette nacheinander auf die Motorräder Suzuki, Honda, BMW und Kawasaki zugreifst, und zwar in dieser Reihenfolge, bis du das passende findest.
Wenn du dabei auf eins zugreifst, das schon gelöscht wurde, dann stürzt das ab, und zwar da, wo du auf die Member vorname und name zugreifst.

Beispiel: Du willst die Honda löschen, und die Suzuki ist bereits gelöscht (d.h. der Zeiger Suzuki_Bandit zeigt auf 0). Dann kommst du als erstes in den Vergleich

C++:
if ((temp3==Suzuki_Bandit->vorname) && (temp4==Suzuki_Bandit->name))


So, Suzuki_Bandit zeigt auf 0. Was passiert, wenn man auf 0->vorname zugreift? Richtig: Es knallt, und bei

C++:
else if ((temp3==Honda_TransAlp->vorname) && (temp4==Honda_TransAlp->name))


kommst du gar nicht mehr an.

Du darfst diese String-Vergleiche nur machen, wenn der Motorrad-Pointer auf etwas Gültiges zeigt.

Allgemein gesprochen ist diese Form der Datenhaltung nicht wirklich günstig, das merkst du gerade selber. Du solltest da nochmal drüber nachdenken und eine bessere Form wählen.

Noch etwas allgemeiner gesprochen solltest du dringend lernen, wie man mit einem Debugger umgeht, weil du derartige Programmierfehler dann selber verfolgen und aufdecken könntest. Ich finde solche Fehler nur durch Lesen des Codes, aber ich habe auch mehr als 20 Jahre Berufserfahrung. Für Anfänger wie dich ist es um so wichtiger, Testwerkzeuge zu kennen und benutzen zu können.

Der Debugger ist das wichtigste Testwerkzeug überhaupt. Auch wenn das unverständlicherweise (*) in fast keinem Kurs systematisch gelehrt wird, ist es doch in der Praxis quasi überlebensnotwendig, das zu können.

(*) Mir ist schon klar warum: Es ist nichts, was man in zehn Minuten auf ne Folie tippen und dann vortragen kann, man braucht etwas Vorbereitung dazu. Ich schätze, die Lehrer haben darauf einfach keinen Bock. Und sie sehen die Notwendigkeit nicht, weil sie selbst von praktischer Programmierarbeit meilenweit entfernt sind und immer nur ihre Lehrbeispiele wiederkäuen, die sie seit Jahren kennen und blind hinschreiben können. Für sowas braucht man in der Tat keinen Debugger, aber für alles andere schon.

Dieser Post wurde am 20.12.2016 um 09:13 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: