Klasse in Vector



  • Hallo liebe Community-User,

    habe ein Problem in meinem CPP-Code, wo ich leider seit Stunden nicht mehr weiter komme. Seit langem kniffeln kam ich leider auf keine weitere Idee und wollte hier mal unsere "Könner" fragen. Mein Problem ist folgendes und zwar die Ausgabe. Wenn ich nur die ID's der jeweiligen Kunden ausgegeben haben möchte bekomme ich in nur fünf 0'en ausgespuckt. Anschließend kommt bei Netbeans "Build failed" raus, falls ich die "firstName", etc. auch möchte.

    // Main

    #include <cstdlib>
    #include <iostream>
    
    #include "CustomerList.h"
    #include "Customer.h"
    
    using namespace std;
    
    int main(int argc, char** argv) {
        // IST VORGEGEBEN
        CustomerList iCustomerList;
        iCustomerList.insert(Customer("Arz", "Johannes", 63512, "Klein-Krotzenburg"));
        iCustomerList.insert(Customer("Altenbernd", "Peter", 63654, "Buedingen"));
        iCustomerList.insert(Customer("Weber", "Wolfgang", 67655, "Kaiserslautern"));
        iCustomerList.insert(Customer("Hergenroether", "Elke", 33098, "Paderborn"));
        iCustomerList.insert(Customer("Weber", "Hans", 63762, "Wenig-Umstadt"));
        // BIS HIERHER
    
        int iAuswahl = 0;
    
        while (iAuswahl != 10) {
    
            cout << "[1]Kunde loeschen" << endl;
            cout << "[2]Kunde kopieren" << endl;
            cout << "[3]Kunden alphabetisch sortieren" << endl;
            cout << "[4]Kunden nach Kundennummer sortieren" << endl;
            cout << "[5]Kunden ueber Nachnamen/Vornamen finden" << endl;
            cout << "[6]Alle Kunden ausgeben" << endl;
            cout << "[10]Programm beenden" << endl;
            cout << "Ihre Auswahl: ";
            cin >> iAuswahl;
    
            switch (iAuswahl) {
    
                case 1: break;
                case 2: break;
                case 3: break;
                case 4: break;
                case 5: break;
                case 6: 
                    iCustomerList.showAll(); 
                    break;
                default: 
                    cout << "Falsche Eingabe!" << endl;
                    cin >> iAuswahl;    
            }
        }
    }
    

    // CustomerList.h

    #ifndef CUSTOMERLIST_H
    #define	CUSTOMERLIST_H
    #include <iostream>
    #include <vector>
    #include "Customer.h"
    using namespace std;
    
    class CustomerList {
    public:
        CustomerList();
        CustomerList(const CustomerList& orig);
        virtual ~CustomerList();
        void insert(Customer);
        void showAll();
        unsigned int NextCustomerID = 100;
        vector<Customer> vCustomer;
    private:
    
    };
    
    #endif	/* CUSTOMERLIST_H */
    

    //CustomerList.cpp

    #include <vector>
    
    #include "CustomerList.h"
    
    CustomerList::CustomerList() {
    }
    
    CustomerList::CustomerList(const CustomerList& orig) {
    }
    
    CustomerList::~CustomerList() {
    }
    
    void CustomerList::insert(Customer customer){
        customer.setID(NextCustomerID);
        NextCustomerID++;
        vCustomer.push_back(customer);
    }
    
    void CustomerList::showAll(){
        for(int i=0; i<=vCustomer.size(); i++){
    
            cout << vCustomer.at(i).getID() << "  ";
            cout << endl;
        }
    }
    

    //Customer.h

    #ifndef CUSTOMER_H
    #define	CUSTOMER_H
    #include <iostream>
    #include <cstdlib>
    using namespace std;
    
    class Customer {
    public:
        Customer(string, string, unsigned int, string);
        Customer(const Customer& orig);
        virtual ~Customer();
        void setLastName(string);
        void setFirstName(string);
        void setPostalCode(unsigned int);
        void setCity(string);
        void setID(unsigned int);
    
        string getLastName();
        string getFirstName();
        unsigned int getPostalCode();
        string getCity();
        unsigned int getID();
    
    private:
        string lastName;
        string firstName;
        unsigned int postalCode;
        string city;
        unsigned int id;
    };
    
    #endif	/* CUSTOMER_H */
    

    //Customer.cpp

    #include "Customer.h"
    
    Customer::Customer(string sLastName, string sFirstName, unsigned int uiPostalCode, string sCity) {
        setFirstName(sFirstName);
        setLastName(sLastName);
        setPostalCode(uiPostalCode);
        setCity(sCity);
    }
    
    Customer::Customer(const Customer& orig) {
    }
    
    Customer::~Customer() {
    }
    
    // SETTER
    void Customer::setLastName(string sLastName){
        this-> firstName = sLastName;
    }
    
    void Customer::setFirstName(string sFristName){
        this-> lastName = sFristName;
    }
    
    void Customer::setPostalCode(unsigned int uiPostalCode){
        this-> postalCode = uiPostalCode;
    }
    
    void Customer::setCity(string sCity){
        this-> city = sCity;
    }
    
    void Customer::setID(unsigned int uiID){
        this-> id = uiID;
    }
    
    // GETTER
    string Customer::getLastName(){
        return lastName;
    }
    
    string Customer::getFirstName(){
        return firstName;
    }
    
    unsigned int Customer::getPostalCode(){
        return postalCode;
    }
    
    string Customer::getCity(){
        return city;
    }
    
    unsigned int Customer::getID(){
        return id;
    }
    

    Ein weiter Fehlercode ist:
    In file included from CustomerList.cpp:3:0:
    CustomerList.h:15:35: warning: non-static data member initializers only available with -std=c++11 or -std=gnu++11 [enabled by default]

    keine Ahnung was das bedeuten soll 😞



  • Hallo,

    in showAll läuft deine Schleife von 0 bis size (einschliesslich).
    Das ist einer zuviel. Also < size oder Iteratoren oder foreach nehmen.

    unsigned int NextCustomerID = 100;
    im Header ist erst seit c++11 möglich, daher die Warning und wie man das behebt.



  • Also bei der Ausgabe hat sich anhand des änderns von <= auf < nichts verändert.
    Das andere habe ich leider nicht verstanden.



  • Customer hat einen Kopierkonstruktor, der nichts kopiert. Beim Einfügen in den Vector wird kopiert => alle Customer sind leer.

    Lass den Konstruktor weg. Auch der Destruktor ist überflüssig.



  • Leider muss ich den Konstruktor benutzen weil das von der Aufgabe vorgegeben wird. Deshalb habe ich leider nicht die Möglichkeit den Konstruktor leer zu lassen. In der Main steht auch wie es funktionieren sollte.


  • Mod

    depream schrieb:

    Leider muss ich den Konstruktor benutzen weil das von der Aufgabe vorgegeben wird. Deshalb habe ich leider nicht die Möglichkeit den Konstruktor leer zu lassen. In der Main steht auch wie es funktionieren sollte.

    Das Problem ist doch, dass du einen leeren Kopierkonstruktor geschrieben hast. Im Gegensatz zum automatisch vom Compiler erzeugten Kopierkonstruktor macht dieser also gar nichts. Der automatisch erzeugte Konstruktor hätte einfach alle Member der Klasse kopiert. Wenn du dieses Verhalten nachbilden möchtest, dann musst du das in deinem Konstruktor auch tun.

    Und guck dir bitte an, was eine Initialisierungsliste ist.



  • Aus der main folgt nicht, dass du einen selbst geschrieben Kopierkonstruktor benötigst.

    Testfrage: welcher deiner Konstruktoren ist ein Kopierkonstruktor?



  • Das wäre der Kopierkonstruktor: "Customer(const Customer& orig);"

    Eine weitere Frage hätte ich zum Abschluss meines Projekts. Ich müsste nur noch die Personen alphabetisch ordnen können. Jetzt habe ich mich schon einige Zeit rumgeschlagen und kam leider nicht mehr weiter. Gefunden habe ich die Funktion:

    sort(vector.begin(), vector.end());
    

    ABER! da mein Inhalt des Vectors "vCustomer" nicht gleich einem String-Vector entspricht ging das Licht leider wieder aus 🙂 Habt ihr eventuelle Tipps für meine Fortsetzung?


  • Mod

    Dann musst du eine entsprechende Funktion schreiben, in der du beschreibst, wie der Vergleich stattfinden soll. Die Funktion gibt einen bool zurück und nimmt zwei Argumente vom Typ deiner Klasse (oder Referenzen auf deine Klasse). Wenn das erste Argument als "kleiner" gelten soll (nicht "kleiner gleich"!), dann gibst du true zurück, in allen(!) anderen Fällen false.

    Wenn du diese Funktion operator< nennst (Operatorüberladung), dann findet das sort sie automatisch, da "<" das Standardkriterium für sort ist. Wenn du sie anders nennst, dann musst du die Funktion als dritten Parameter bei sort angeben.

    Für all dies solltest du reichlich Beispiele finden, in guten Referenzen zu sort.

    Noch etwas, da ich es gerade sehe:
    Dresden und Umgebung haben Postleitzahlen, die mit 0 losgehen. Der Ort, wo ich derzeit wohne hat, wenn man es ganz genau nimmt, sogar nicht-Ziffern-Zeichen in der Postleit"zahl". Kommt dein Programm damit zurecht? Umgekehrt: Wirst du wohl jemals die Summe zweier Postleitzahlen ausrechnen müssen? Warum dann ein arithmetischer Datentyp?


Log in to reply