Mit Iterator auf Methoden von abgeleiteter Klasse zugreifen



  • Hier das Beispiel, wie ich es versuche.
    Ich möchte die getter aus der Klasse Lebensmittel in der Verwaltung mit dem Iterator aufrufen. Genau wie es beim ersten beispiel mit der display Methode.
    Dafür habe ich jetzt die folgendes gemacht.

    #include <string>
    #include <iostream>
    #include <list>
    using namespace std;

      class Essen {
      protected:
      
      	string produktbezeichnung;
      	int produktID;
      
      public:
      
      	Essen(string iniProduktbezeichnung, int iniProduktID) {
      
      		produktbezeichnung = iniProduktbezeichnung;
      		produktID = iniProduktID;
      	}
      
      	int getID() {
      		return produktID;
      	}
             
               virtual int getAblaufdatum(){}; // Das funktioniert nicht, mit void funktioniert es.
                // ich muss aber einen int zurückgeben.   
      };
      
      class Lebensmittel : public Essen {
      private:
      
      	struct Datum {
      		int Tag;
      		int Monat;
      		int Jahr;
      	};
      
      	Datum datum;
      
      public:
      
      	Lebensmittel(string iniProduktbezeichnung, int iniProduktID, float inipreis, int iniLagerBestand, Datum iniDatum)
      		:Essen(iniProduktbezeichnung, iniProduktID)
      	{
      		datum = iniDatum;
      	}
      
      	void displayLebensmittel() {
      
      		cout << "Produktbezeichnung: " << produktbezeichnung << endl;
      		cout << "Produkt-ID " << produktID << endl;
      		cout << "Datum " << datum.Tag << "." << datum.Monat << "." << datum.Jahr << endl;
      	}
      
      	int getAblaufdatum() {
      		return datum.Tag; // Hier ist die getter.
      	}
      };
      
      class Verwaltung {
      private:
      
      	list <Essen*> liste;
      	list <Essen*>::iterator it;
      
      public:
      
      	Verwaltung() {};
      
      	void bestellungEinfügen(Essen* produkt) {
      		liste.push_back(produkt);
      	}
      
      	void alleProdukteAnzeigen() {
      
      		cout << "" << endl;
      		cout << "Alle Bestellungen anzeigen des is!!!!" << endl;
      		cout << "" << endl;
      
      		for (it = liste.begin(); it != liste.end(); it++) {
      
      			(*it)->displayLebensmittel; 
      		}
      	}
      };
      
      void main() {
      
      	// Teststruktur wurde jetzt nich angegeben.
      
      }


  •        virtual int getAblaufdatum(){}; // Das funktioniert nicht, mit void funktioniert es.
    

    Du darfst hier nicht {} schreiben, sondern du brauchs = 0;
    Also:
    virtual int getAblaufdatum() = 0;



  • Danke hat funktioniert.



  • Das Hinzufügen aller möglichen Zugriffsmethoden zur Basisklasse ist aber designtechnisch schlecht und hilft überhaupt nicht dabei OOP zu verstehen.

    Entweder jedes Essen hat ein Ablaufdatum, aber dann gehört auch dieses selbst in die Basisklasse oder aber nur die abgeleitete Klasse Lebensmittel hat ein Ablaufdatum und somit entsprechende Zugriffsfunktionen (auch wenn man dann nicht direkt per Essen*darauf zugreifen kann, sondern casten muß).

    Welche anderen von Essen abgeleiteten Klassen könnte es denn noch geben (so daß dieses Beispiel einen Sinn ergibt)?



  • Desweiteren rate ich zu einem C++-Fachbuch. Das hier riecht nach C-mit-Klassen, was man grundsätzlich unnötig ist.
    Was darüber hinaus empfehlenswert ist: Die Nutzung von "override" bei Funktionen die etwas überladen.



  • @It0101 sagte in Mit Iterator auf Methoden von abgeleiteter Klasse zugreifen:

    Die Nutzung von "override" bei Funktionen die etwas überladen.

    überschreiben 😉


Anmelden zum Antworten