Member Fields haben keinen Wert



  • Hallo Ich habe folgenden Code geschrieben und gerade keine Ahnung warum die member der LVA Objekte, welche im vector lvas gespeichert werden keinen Wert haben.

    LVA.h

    #ifndef LVA_H
    #define	LVA_H
    
    #include <string>
    #include <iostream>
    
    using namespace std;
    
    class LVA {
    public:
    
        enum Status {
            DONE, IN_PROGRESS, TO_DO
        };
    
        enum Type {
            VO, VU, UE, SE
        };
        LVA();
        LVA(const LVA& orig);
        virtual ~LVA();
        void SetEcts(double ects);
        double GetEcts() const;
        void SetType(Type type);
        Type GetType() const;
        void SetStatus(Status status);
        Status GetStatus() const;
        void SetName(string name);
        string GetName() const;
        friend ostream& operator<<(ostream& os, const LVA& lva);
    private:
        string name;
        Status status;
        Type type;
        double ects;
    
    };
    
    #endif	/* LVA_H */
    

    LVA.cpp

    #include "LVA.h"
    
    enum Status {
        DONE, IN_PROGRESS, TO_DO
    };
    
    enum Type {
        VO, VU, UE, SE
    };
    
    LVA::LVA() {
    }
    
    LVA::LVA(const LVA& orig) {
    }
    
    LVA::~LVA() {
    }
    
    void LVA::SetEcts(double ects) {
        this->ects = ects;
    }
    
    double LVA::GetEcts() const {
        return ects;
    }
    
    void LVA::SetType(Type type) {
        this->type = type;
    }
    
    LVA::Type LVA::GetType() const {
        return type;
    }
    
    void LVA::SetStatus(Status status) {
        this->status = status;
    }
    
    LVA::Status LVA::GetStatus() const {
        return status;
    }
    
    void LVA::SetName(string name) {
        this->name = name;
    }
    
    string LVA::GetName() const {
        return name;
    }
    
    ostream& operator<<(ostream& os, const LVA& lva) {
        os << "LVA: " << lva.GetName() << ", ECTS: " << lva.GetEcts() << ", STATUS: " << lva.GetStatus();
        return os;
    }
    

    Manager.h

    #ifndef MANAGER_H
    #define	MANAGER_H
    
    #include <vector>
    #include <iostream>
    #include "LVA.h"
    
    using namespace std;
    
    class Manager {
    public:
        Manager();
        Manager(const Manager& orig);
        virtual ~Manager();
        vector<LVA> GetLvas() const;
        void AddLva(LVA& lva);
        void print();
    private:
        vector<LVA> lvas;
    
    };
    
    #endif	/* MANAGER_H */
    

    Manager.cpp

    #include "Manager.h"
    
    Manager::Manager() {
    }
    
    Manager::Manager(const Manager& orig) {
    }
    
    Manager::~Manager() {
    }
    
    vector<LVA> Manager::GetLvas() const {
        return lvas;
    }
    
    void Manager::AddLva(LVA& lva) {
        lvas.push_back(lva);
    }
    
    void Manager::print() {
        for (vector<LVA>::iterator it = GetLvas().begin(); it != GetLvas().end(); ++it) {
            cout << *it;
        }
    
    }
    
    #include <cstdlib>
    #include <iostream>
    #include "Manager.h"
    #include "LVA.h"
    
    using namespace std;
    
    int main(int argc, char** argv) {
        LVA lva;
        lva.SetEcts(6.0);
        lva.SetName("TestLVA");
        lva.SetStatus(LVA::DONE);
        lva.SetType(LVA::UE);
        Manager manager;
        manager.AddLva(lva);
        manager.print();
        return 0;
    }
    

    Das Programm compiliert ganz normal und lässt sich starten.
    Beim Aufruf von manger.print() wird auch ein Objekt herausgeschrieben, allerdings mit keinen werten. z.b. ects ist 0 statt 6.0... usw....

    Was mache ich hier falsch?

    lg



  • vector<LVA> GetLvas() const;
    

    Lass dir ma eine const-Referenz anstatt einer Kopie zurueckgeben. Dann sind deine Iteratoren vielleicht gueltig. Oder du benutzt gleich lvas.begin()/end() anstatt ueber die Memberfunktion zu gehen.



  • hallo,
    thx für die antwort.
    Das scheint nicht das problem zu sein.

    Sogar wenn ich direkt in der methode AddLva(LVA& lva) nach dem push_back auf das element im vector zugreife sind die felder nicht gesetzt:

    z.B.:

    void Manager::AddLva(LVA& lva) {
        lvas.push_back(lva);
        cout << lvas.at(0).GetEcts(); //liefert 0 anstatt 6.0
    
    }
    

    😕



  • Okay, dein Kopierkonstruktor ist leeeeeeer.



  • 😮 meine güte, den hab ich ja ganz übersehn, wurde von der IDE generiert.
    vielen dank 🙂 👍



  • Du hast in Lva einen Copy-Konstruktor implementiert, der aber nichts tut => beim Einfügen mit push_back in den Vector verschwinden alle Daten. Die Konstruktoren un der Destruktor (auch noch virtual) sind so völlig sinnlos und können komplett entfernt werden Dann klappts vielleicht auch.



  • Ja danke 🙂

    Könnte vielleicht auch noch jemand auf das enum schauen?
    Habe ich das richtig implementiert? oder macht man sowas anders?
    Muss ich das enum wirklich in der .h UND in der .cpp datei definieren?

    lg



  • lion87 schrieb:

    Muss ich das enum wirklich in der .h UND in der .cpp datei definieren?

    Nein, musst du nicht.
    Tust du auch nicht.
    Du definierst im .h File den enum Typen LVA::Status , und im .cpp File einen weiteren enum Typen namens Status .
    Also 1x als Member der Klasse, und 1x im globalen Namespace.

    Und das selbe nochmal mit LVA::Type / Type .


Anmelden zum Antworten