Datenbank aus Objekten?



  • Ich hab gleich noch eine Frage.
    Wenn ich bei der Funktion erstelleKunde keinen Wert zurückgebe kann ich ja nichts damit anfangen.
    Dementsprechend müsste ich doch den erstelltenKunden zurück geben.
    Wie kann ich Objekte zurück geben.
    Der Code:

    kunde erstelleKunde(){
    
        kunde erstellterKunde;                              //muss ich ja machen, wenn ich die eingaben übergeben will, oder?
    
        string name, vorname, firmenname;
        int umsatz, kundennr;
    
        cout << "Name des Kunden: ";
        cin >> name;
    
        cout << "Vorname des Kunden: ";
        cin >> vorname;
    
        cout << "Firmenname des Kunden: ";
        cin >> firmenname;
    
        cout << "Umsatz des Kunden: ";
        cin >> umsatz;
    
        cout << "Kundennummer des Kunden: ";
        cin >> kundennr;
    
        erstellterKunde.setfirmenName(firmenname);
        erstellterKunde.setnachName(name);
        erstellterKunde.setvorName(vorname);
        erstellterKunde.setjahresUmsatz(umsatz);
        erstellterKunde.setkundenNummer(kundennr);
    
        return erstellterKunde;
    }
    

    funktioniert nicht.
    Fehler: Functions that differ only in their return type cannot be overloaded

    [EDIT] Hat sich erledigt. Ich habe nur vergessenen in der Header Datei void auf kunde zu wechseln.



  • Der Compiler wird wohl noch etwas mehr sagen.



  • [EDIT] Hat sich erledigt

    Ich hab gerade nochmal geguckt. Es gib keine Buildtime und auch keine Runtime Fehler.

    Ich benutze Xcode Wenn ich das Programm starte wird Zeile 20 (kunde erstellterKunde;) grün markiert und daneben steht: Thread 1: breakpoint 2.1
    In der Konsole wird (11db) angezeigt.

    Keine Ahnung was das ist.

    aktualisierter Code:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include "main.hpp"
    #include "classKunde.hpp"
    #include "classDatenbank.hpp"
    #include "infilestream.hpp"
    
    using namespace std;
    
    void loadKundeInDatabase(const kunde& createdKunde){    /* soll eine objekt der Klasse  datenbank erstellen und
                                                             und dann mit der funktion neuerKunde den Kunden in den Vektor pushen*/
        datenbank database;
        database.neuerKunde(createdKunde);
    }
    
    kunde erstelleKunde(){
    
        kunde erstellterKunde;                              //muss ich ja machen, wenn ich die eingaben übergeben will, oder?
    
        string name, vorname, firmenname;
        int umsatz, kundennr;
    
        cout << "Name des Kunden: ";
        cin >> name;
    
        cout << "Vorname des Kunden: ";
        cin >> vorname;
    
        cout << "Firmenname des Kunden: ";
        cin >> firmenname;
    
        cout << "Umsatz des Kunden: ";
        cin >> umsatz;
    
        cout << "Kundennummer des Kunden: ";
        cin >> kundennr;
    
        erstellterKunde.setfirmenName(firmenname);
        erstellterKunde.setnachName(name);
        erstellterKunde.setvorName(vorname);
        erstellterKunde.setjahresUmsatz(umsatz);
        erstellterKunde.setkundenNummer(kundennr);
    
        return erstellterKunde;
        }
    
    int main() {
    
        loadKundeInDatabase(erstelleKunde());
    
        return 0;
    }
    


  • So jetzt noch eine Sinnvolle Frage.

    Nehmen wir mal an ein Kunde wird in dem Vektor "kunden" gespeichert.
    Wie findet der zugriff auf eines der Objekte statt.

    Ich möchte jetzt mit kunde.getKundenNummerByName(); die Kundennummer erhalten

    kunden[0] = kunde 1
    kunden[1] = kunde 2
    ...

    wenn ich jetzt die kundeNummer von Kunde 2 ausgeben will.
    Ich kann ja nicht auf den Vector zugreifen, weil dieser private ist.
    also: kunden[1].getKundenNummerByName geht nicht.



  • Du hast im Debugger einen Breakpoint gesetzt und das Programm wird jetzt dort angehalten. Du wirst dich wohl mal mit der XCode Dokumentation auseinandersetzen müssen.



  • Ja hab ich schon gemerkt 😉



  • kaiuwe schrieb:

    So jetzt noch eine Sinnvolle Frage.

    Nehmen wir mal an ein Kunde wird in dem Vektor "kunden" gespeichert.
    Wie findet der zugriff auf eines der Objekte statt.

    Ich möchte jetzt mit kunde.getKundenNummerByName(); die Kundennummer erhalten

    kunden[0] = kunde 1
    kunden[1] = kunde 2
    ...

    wenn ich jetzt die kundeNummer von Kunde 2 ausgeben will.
    Ich kann ja nicht auf den Vector zugreifen, weil dieser private ist.
    also: kunden[1].getKundenNummerByName geht nicht.

    Ich würde der Klasse Datenbank eine öffentliche Methode "getKundeByName" spendieren, die hat ja Zugriff auf die privaten Daten.

    Kunde getKundeByName(const std::string& name);
    

    In dieser Funktion gehst du durch alle Elemente (die Kunden) im Vector bis du den gesuchten gefunden hast und diesen gibst du zurück.

    In deinem Programm kannst du dann schreiben:

    auto gesuchterKunde = datenbank.getKundeByName("Mustermann");
    
    auto kundennummer = gesuchterKunde.getKundennummer();
    
    // oder zusammen, wenn du von dem Kunden wirklich NUR die Kundennummer brauchst
    
    auto kundennummer = datenbank.getKundeByName("Mustermann").getKundennummer();
    


  • Du weißt schon, dass die Datenbank nicht lange Bestand hat, weil am Ende der Routine der Gültigkeitsbereich der Variablen endet?

    void loadKundeInDatabase(const kunde& createdKunde){    /* soll eine objekt der Klasse  datenbank erstellen und
                                                             und dann mit der funktion neuerKunde den Kunden in den Vektor pushen*/
        datenbank database;
        database.neuerKunde(createdKunde);
    } // hier wird "database" wieder zerstört
    


  • kaiuwe schrieb:

    void erstelleKunde(){
        string name, vorname, firmenname;
        int umsatz, kundennr;
        
        cout << "Name des Kunden: ";
        cin >> name;
        
        cout << "Vorname des Kunden: ";
        cin >> vorname;
        
        cout << "Firmenname des Kunden: ";
        cin >> firmenname;
        
        cout << "Umsatz des Kunden: ";
        cin >> umsatz;
        
        cout << "Kundennummer des Kunden: ";
        cin >> kundennr;
        
        kunde erstellterKunde;                              //muss ich ja machen, wenn ich die eingaben übergeben will, oder?
        
        erstellterKunde.setfirmenName(firmenname);
        erstellterKunde.setnachName(name);
        erstellterKunde.setvorName(vorname);
        erstellterKunde.setjahresUmsatz(umsatz);
        erstellterKunde.setkundenNummer(kundennr);
        
        loadKundeInDatabase(erstellterKunde);
    }
    

    Stimmt schon so. Es wäre geschickter einen Konstruktor für "Kunde" zu schreiben, damit du direkt ein gültiges Kundenobjekt erzeugen kannst.

    // variablen cin cout usw. was oben schon steht
    
    Kunde kunde{name, vorname, firmenname, umsatz, kundennummer};
    
    return kunde;
    


  • temi schrieb:

    Du weißt schon, dass die Datenbank nicht lange Bestand hat, weil am Ende der Routine der Gültigkeitsbereich der Variablen endet?

    void loadKundeInDatabase(const kunde& createdKunde){    /* soll eine objekt der Klasse  datenbank erstellen und
                                                             und dann mit der funktion neuerKunde den Kunden in den Vektor pushen*/
        datenbank database;
        database.neuerKunde(createdKunde);
    } // hier wird "database" wieder zerstört
    

    wäre es ratsam die Datenbank direkt im Hauptprogramm du erstellen?

    wie hier:

    #include <iostream>
    #include <fstream>
    #include <string>
    #include "main.hpp"
    #include "classKunde.hpp"
    #include "classDatenbank.hpp"
    #include "infilestream.hpp"
    
    using namespace std;
    
    datenbank database;
    
    void loadKundeInDatabase(const kunde& createdKunde){
    
        database.neuerKunde(createdKunde);
    }
    
    int main() {
    
        return 0;
    }
    


  • kaiuwe schrieb:

    Wäre es ratsam die Datenbank direkt im Hauptprogramm du erstellen?

    Ja.

    Warum nicht so?

    int main()
    {
        Datenbank db;
        db.loadFromFile("db.dat");    
    
        // irgendwelcher Code
    
        db.neuerKunde(erstelleKunde());
    
        // noch mehr Code
    
        db.saveToFile("db.dat");
    } // hier wird "db" ungültig, aber hier endet ja auch das Programm
    

Anmelden zum Antworten