Abstrakte Klasse & Text einlesen modifizieren



  • Handelsmaterial* hm = new Handelsmaterial(...);
    -> ergibt folgende Fehlermeldung:

    Materialverwaltung.cpp:58:91: error: invalid new-expression of abstract class type 'Handelsmaterial'
                 Handelsmaterial* hm = new Handelsmaterial(bestellDauer_, matNr_, beschreibung_);
    

    Handelsmaterial.h

    #ifndef HANDELSMATERIAL_H
    #define	HANDELSMATERIAL_H
    #include "Material.h"
    
    class Handelsmaterial : virtual public Material{
    public:
        Handelsmaterial(int bestellDauer_, string matNr_, string beschreibung);
        Handelsmaterial(const Handelsmaterial& orig);
        virtual ~Handelsmaterial();
        int getBestellDauer();
    private:
        int bestellDauer;
    };
    
    #endif	/* HANDELSMATERIAL_H */
    

    Handelsmaterial.cpp

    #include "Handelsmaterial.h"
    
    Handelsmaterial::Handelsmaterial(int bestellDauer_, string matNr_, string beschreibung_) {
        this->bestellDauer = bestellDauer_;
        setBeschreibung(beschreibung_);
        setMatNr(matNr_);
    }
    
    Handelsmaterial::Handelsmaterial(const Handelsmaterial& orig) {
    }
    
    Handelsmaterial::~Handelsmaterial() {
    }
    
    int Handelsmaterial::getBestellDauer() {
        return bestellDauer;
    }
    


  • Die Fehlermeldung sagts ja schon: Deine Handelsmaterial Klasse ist abstrakt und daher kannst du kein Objekt davon anlegen. Die Klasse ist abstrakt wegen folgender Funktionen:

    virtual void setProduktionsDauer(string produktionsDauer_) = 0;
    virtual void setBestellDauer(string bestellDauer_) = 0;
    

    Sollten die Funktionen wirklich in die Basisklasse? Ich denke eher nicht.



  • Abstrakt ist doch die Klasse Material. Handelsmaterial erbt doch von Material. Also müsste doch Handelsmaterial durch virutal void setProduktionsDauer(..) = 0; diese Funktion erben oder verstehe ich es komplett falsch? Sinn und Zweck einer Abstrakten Klasse bzw. Vererbung ist doch, dass die Unterklassen die Public-Funktionen erbt, damit man die selben Funktionen nicht nochmal deklarieren muss?



  • Eine abstrakte Klasse ist eine Klasse mit einer oder mehreren pure virtual Funktionen (also die mit virtual funktionsname() = 0; ). Daher ist schonmal deine Material Klasse abstrakt. Aber deine Handelsmaterial Klasse ist ebenfalls abstrakt weil du die Funktionen zwar erbst aber immer noch keine Implementierung dafür hast. Sie sind also immer noch pure virtual. Die Lösung ist in Handelsmaterial die beiden Funktionen zu Implementieren (was du vermutlich nicht möchtest weil sich setProduktionsDauer gar nicht auf ein Handelsmaterial bezieht) oder die Funktionen aus der Basisklasse raus zu nehmen und nur in den entsprechenden abgeleitete Klassen zur verfügung zu stellen (möchtest du vermutlich).



  • Danke an sebi707 👍 👍 👍

    Ohh man bin ich blöd 😃 🕶

    virtual void setBeschreibung(string beschreibung_);
        virtual string getBeschreibung();
        virtual void setMatNr(string matNr_);
        virtual string getMatNr();
    

    Wieso auch immer ich die anderen Funktionen so implementiert habe, verstehe ich nun auch nicht, aber so sollte es doch richtig sein? Habe gerade auch einen Test gemacht, funktioniert so wie ich es möchte 🙂

    Aber eine Bestätigung, dass ich es richtig gemacht habe, wäre perfekt 🙂

    Ansonsten würde ich noch gerne wissen, wie ich die Funktion "dateiEinlesen()" modifizieren könnte. Ich denke es gibt bestimmt Möglichkeiten es einfacher und kürzer zu machen oder?



  • Was war jetzt die Lösung? Die 4 Funktionen da virtual zu machen wohl nicht...

    depream schrieb:

    Ansonsten würde ich noch gerne wissen, wie ich die Funktion "dateiEinlesen()" modifizieren könnte. Ich denke es gibt bestimmt Möglichkeiten es einfacher und kürzer zu machen oder?

    Ja. Was soll das ganze mit dem stringstream?

    getline(file, buffer, '|');
    ss << buffer;
    ss >> typ_;
    ss.clear();
    

    Könntest du genauso auch als

    getline(typ_, buffer, '|');
    

    schreiben. Ich vermute du hast es eingebaut um die strings zu einem int zu konvertieren. Das geht auch mit stoi.



  • Nachdem ich die 4 Funktionen auf virtual gesetzt habe, wird mir nun auch unter den Unterklassen diese Funktion angezeigt. Das sollte doch so richtig sein oder nicht?



  • Aber die Problemfälle waren doch gerade setProduktionsDauer/setBestellDauer. Was hast du mit denen gemacht?



  • Aus Material gelöscht?



  • Achso OK. Das virtual bei den 4 Funktionen wäre jetzt übrigens nicht zwingend Notwendig gewesen, da dir das nur was bringt wenn du die Funktionen in den anderen Klassen überschreiben wolltest. Ist aber sicherlich nicht verkehrt die auch virtual zu machen.

    Eine Sache die mir vorhin noch aufgefallen ist:

    class Handelsmaterial : virtual public Material{
    

    Das virtual hier braucht man nur um das Diamon Problem zu lösen. Für normale Vererbung braucht man es nicht.


Anmelden zum Antworten