Vererbung



  • Hallo zusammen,
    kann mir jemand bei dieser Aufgabe bitte weiterhelfen?
    Ich versuche mir das Thema "Vererbung" beizubringen, aber es will einfach nicht funktionieren.

    #include <iostream>
    #include <string.h>
    #include <stdlib.h>
    
    using namespace std;
    
    class Artikel
    {
    public:
    Artikel ();
    Artikel (int a, char *n, float p);
    void Ausgabe(void);
    private:
    int Art_Nr;
    char Name[80];
    float Preis ;
    };
    class Naehrmittel : Artikel {
    private:
    int Kalorien;
    float Eiweiss;
    float Fett;
    
    public:
    Naehrmittel() {
    Kalorien = 0;
    Eiweiss = 0.0;
    Fett = 0.0;
    }
    Naehrmittel (int k, float e, float f) : Artikel(1, "keine Angabe", 1.)/*, Kalorien(k), Eiweiss(e), Fett(f)*/ {
    Kalorien = k;
    Eiweiss = e;
    Fett = f;
    }
    void sag_Fett(void);
    void Ausgabe(void);
    };
    
    void Naehrmittel::sag_Fett(void) {
    cout<<Fett<<endl;
    }
    
    void Naehrmittel::Ausgabe(void) {
    cout<<Kalorien<<", "<<Eiweiss<<", "<<Fett<<endl;
    }
    
    void Artikel::Ausgabe(void) {
    cout<<Art_Nr<<", "<<Name<<", "<<Preis<<endl;
    }
    
    Artikel::Artikel (int a, char *n, float p) {
    Art_Nr = a;
    strcpy(Name, n);
    Preis = p;
    }
    
    main () {
    Naehrmittel x[100] = { Naehrmittel(1, "Mehl", 1.19, 300, 0.2, 0.05) ,
    Naehrmittel(2, "Nudeln", 1.79, 200, 0.4, 0.1) ,
    Naehrmittel(3, "Nutella",2.29, 1800, 0.3, 0.6) };
    x[2]. Ausgabe();
    system("pause");
    }
    


  • sunny89 schrieb:

    Hallo zusammen,
    kann mir jemand bei dieser Aufgabe bitte weiterhelfen?
    Ich versuche mir das Thema "Vererbung" beizubringen, aber es will einfach nicht funktionieren.

    1. Welche Aufgabe? Du hast nicht gesagt was du ueberhaupt moechtest.
    2. Was funktioniert nicht?



  • sunny89 schrieb:

    Ich versuche mir das Thema "Vererbung" beizubringen, aber es will einfach nicht funktionieren.

    Zusammen mit dem geilen Wort für Nahrungsmittel dachte ich schon fast es wäre der 1. April. Das ist deine Fehlerbeschreibung? 😃
    Oder meinst du etwa tatsächlich http://de.wikipedia.org/wiki/Nährmittel ?



  • sunny89 schrieb:

    ...

    Das deine Problembeschreibung fehlt sollte durch die anderen schon klar sein. Einige Anmerkungen habe ich aber:

    0. Allgemeiner Stil...
    a) Sofern nicht durch das Kopieren die Einrückungen verloren gegangen sind: Sie fehlen (Worunter die Lesbarkeit massiv leidet).
    b) void als Parameterangabe ist unter C++ unüblich und eine inhaltslose Zusatzinformation. Man kann einfach eine leere Parameterliste statt dessen schreiben.
    c) Warum C-Strings? std::string erleichtert dir das Leben.
    d) Kürze nicht grundlos ab (Deine Kommentare mit den Erklärungen zu den Parametern hättest du dir sparen können, und dein Code wäre von sich aus lesbarer).
    e) Da man normalerweise Header und Source trennt, solltest du zumindest im Hinterkopf behalten, das man using namespace niemals in Headern verwenden sollte.

    1. Header

    #include <iostream>
    #include <string.h> // <-- Wenn heißt es <cstring> (C-Kompatibilitätsheader)
                        // Ich würde hier ohnehin std::string aus <string> vorziehen
    #include <stdlib.h> // <-- Wenn heißt es <cstdlib> (C-Kompatibilitätsheader)
    

    2. Anmerkung zu den Konstruktoren

    Du schreibst 2 Konstruktoren, bei denen du dir einen hättest sparen können. Zudem ist die Initialisierungsliste der nachträglichen Zuweisung im Konstruktorrumpf vorzuziehen.

    Mal auszugsweise ein Gegenvorschlag (Ich verwende dabei meine bevorzugtenBenennungs- und Formatierungsregeln, mit Ausnahme der Einrückungstiefe - hier nutze ich eher 4 statt 2 Zeichen):

    #include <iostream>
    #include <string>
    
    //...
    
    class Artikel
    {
      public:
        Artikel(
          int artikelNr = 0,
          std::string const & name = "",
          float preis = 0.0);
        void Ausgabe(); // <-- Die Ausgabe würde ich nicht in den Artikel packen.
    
      private:
        int artikelNr;
        string name;
        float preis;
    };
    
    Artikel::Artikel(
        int artikelNr,
        std::string const & name,
        float preis)
    :   artikelNr(artikelNr), // <-- Nutzung der Initialisierungsliste
        name(name),           // <-- std::string lässt sich leicht kopieren.
        preis(preis)
    {
    }
    
    //...
    


  • Im Eifer des Gefechts habe ich mich wirklich ein wenig ungünstig ausgedrückt.
    Also meine Frage ist eigentlich, warum mein Programm nicht funktioniert? Wir haben die Klasse Artikel so bekommen, wie ich es gepostet habe und sollten dann eine Klasse namens Naehrmittel ableiten. Kann man das lösen, ohne dass innerhalb der Basisklasse Artikel irgendetwas umformatiert wird? Wie es mit den C-Strings der Fall ist?!

    Ich meine tatsächlich Nährmittel, nicht Nahrungsmittel. Es wurde mir in der Aufgabe so vorgegeben... Mein Professor besteht darauf, dass wir manche Funktionen mit void kenntlich machen. Ich habe selber mehrmals erfahren, dass es unnötig ist, aber ich mache es trotzdem, damit ich es schon einmal mir anlerne und in der Prüfung nicht vergesse. Meine Header sind richtig. Ich weiß zwar nicht mit welchen Programmen ihr programmiert, aber irgendwie hat mir auch das mein Prof so gelehrt...

    Hat einer eine Idee?



  • sunny89 schrieb:

    Meine Header sind richtig.

    Nur weil einige Compiler das durchlassen, sind sie dennoch nicht richtig. Unter C hättest du Recht, unter C++ nicht.

    Ich weiß zwar nicht mit welchen Programmen ihr programmiert, aber irgendwie hat mir auch das mein Prof so gelehrt...

    Hat einer eine Idee?

    Wechsel den Prof. Okay, dies ist keine Option, ungeachtet wie wenig Ahnung er haben mag.

    Die Headerbenennung gilt seit dem C++98 Standard so, als ich mit C++ angefangen hatte war dieser gerade erst auf den Weg. Zu der Zeit war ein Code wie der oben durchaus normal. Wir sind nur inzwischen ca. 14 Jahre weiter...

    Funktioniert nicht ist auch keine Problembeschreibung. Entweder der Compiler wirft dir einen Fehler, dann nenne diesen auch begrenz dich dabei auf die ersten paar Fehler, meist sind weitere Folgefehler), oder du erhälst ein nicht erwartetes Ergebnis. Dann nenne bitte was du erwartest, und was du erhälst.



  • Naja, das Programm nennt sich irgendwie DevC++, aber es würde mich nicht wundern... Also wenn ich versuche mein Programm zum Laufen zu bringen, dann erhalte ich folgende Meldung:

    no matching function for call to `Naehrmittel::Naehrmittel(int, const char[5], double, int, double, double)'
    candidates are: Naehrmittel::Naehrmittel(const Naehrmittel&)
    Naehrmittel::Naehrmittel(int, float, float)
    Naehrmittel::Naehrmittel()

    Also, wenn ich diese Aufgabe noch lösen könnte, dann könnte ich alle anderen Aufgaben desselben Typs bearbeiten und wäre endlich mit meinem Lernstoff durch. Ich sitze da schon seit zwei Tagen dran...
    Es ist zwar ganz nett als Frau in die spannende Welt der Programmierens hineingeschnuppert zu haben und wahrscheinlich wäre ich auch in der Lage meine Schuhe in einer Datenbank zu erfassen, aber ob ich es wirklich brauche ist eine andere Frage... 😃



  • Poste doch mal die Aufgabenstellung. 🤡





  • sunny89 schrieb:

    http://www.fotos-hochladen.net/uploads/unbenanntbfshxa4vnt.png

    Warum habe ich das Gefühl, dass manche Professoren sich das mit dem Unterrichten noch mal überlegen sollten?

    Wie auch immer: Dein Konstruktor für Nährmittel muss nicht nur die drei, sondern alle sechs Parameter nehmen.

    sunny89 schrieb:

    meine Schuhe in einer Datenbank zu erfassen, aber ob ich es wirklich brauche ist eine andere Frage... 😃

    Da kenn ich schon so Kandidatinnen..



  • cooky451 schrieb:

    sunny89 schrieb:

    http://www.fotos-hochladen.net/uploads/unbenanntbfshxa4vnt.png

    Warum habe ich das Gefühl, dass manche Professoren sich das mit dem Unterrichten noch mal überlegen sollten?

    Untertreib mal nicht. 99% aller Professoren. 😞

    Eine Musterlösung von mir kommt noch.



  • #include <iostream>
    #include <string>
    #include <array>
    #include <algorithm>
    #include <iterator>
    using namespace std;
    
    // Erst mal die Angabe korrigiert. Deutscher Code ist übrigens schrecklich, IMO.
    struct article
    {
    	article(unsigned article_number, string name, unsigned price)
    		: article_number_(article_number)
    		, name_(name)
    		, price_(price)
    	{}
    
    private:
    	unsigned const article_number_;
    	string const name_; // C++ bietet eine Stringklasse
    	unsigned price_; // Preise speichern wir als Ganzzahlen in Cent ab
    
    	// Diese Funktion ersetzt Ausgabe()
    	friend ostream& operator << (ostream& os, article const& a)
    	{
    		return os << "article: { article_number = " << a.article_number_ << ", name = \"" << a.name_ << "\", price = " << a.price_ << " }";
    	}
    };
    
    struct food : article
    {
    	food(unsigned article_number, string name, unsigned price, unsigned calories, double fat, double protein)
    		: article(article_number, name, price)
    		, calories_(calories)
    		, fat_(fat)
    		, protein_(protein)
    	{}
    
    	double fat() const { return fat_; }
    
    private:
    	unsigned const calories_;
    	double const fat_;
    	double const protein_;
    
    	friend ostream& operator << (ostream& os, food const& f)
    	{
    		return os << "food: { calories = " << f.calories_ << ", fat = " << f.fat_ << ", protein = " << f.protein_ << " }\n"
    			  << "\t" << static_cast<article const&>(f);
    	}
    };
    
    int main()
    {
    	array<food, 3> meal =
    	{
    		food(1,    "Mehl", 119,  300, 0.3, 0.05),
    		food(2,  "Nudeln", 179,  200, 0.4, 0.1 ),
    		food(3, "Nutella", 229, 1800, 0.3, 0.6 )
    	};
    
    	copy_if
    	(
    		meal.begin(), meal.end(),
    		ostream_iterator<food>(cout, "\n\n"),
    
    		[] (food const& f)
    		{
    			return f.fat() > 0.2;
    		}
    	);
    }
    

    http://ideone.com/Xf6At



  • Na super, das hilft ihr bestimmt. 😃



  • 314159265358979 schrieb:

    #include <iostream>
    #include <string>
    #include <array>
    #include <algorithm>
    #include <iterator>
    using namespace std;
    
    // Erst mal die Angabe korrigiert. Deutscher Code ist übrigens schrecklich, IMO.
    struct article
    {
    	article(unsigned article_number, string name, unsigned price)
    		: article_number_(article_number)
    		, name_(name)
    		, price_(price)
    	{}
    

    Unterstriche am Ende von Variablennamen sind übrigens schrecklich, IMO.



  • Mir doch egal, ob du das schrecklich findest. Im Gegensatz zu deinem Einwand ist meiner durchaus berechtigt für Produktivcode.



  • 314159265358979 schrieb:

    Mir doch egal, ob du das schrecklich findest. Im Gegensatz zu deinem Einwand ist meiner durchaus berechtigt für Produktivcode.

    Kommt auf die Firma an. Ganz davon abgesehen ziehe ich zwar auch eine einheitliche Sprache vor, aber mir ist Deutsch oder sogar "leichtes" Denglisch (Begrenzt auf die üblichen englischen Begriffe) lieber, als schlechtes oder unpassendes Englisch.

    Ich kenne einige Firmen die ausschließlich den deutschen Markt bedienen (alleine schon, weil sie gar nicht die Kapazitäten für eine Internationalisierung hätten, und alleine schon auf diesen Markt noch Wachstumschancen haben). In solchen Firmen halte ich deutschen Code sogar für besser, weil er die Fachbegriffe die in der Software verwendet werden auch wiederspiegelt.

    Zudem darf man zwar an den Professoren Kritik üben, diese geben einem aber nun einmal den Lehrstoff (wie gut/schlecht auch immer) vor, und es gibt einige die alleine abweichende Bezeichner schon schlecht bewerten (Ich habe persönlich kein Respekt vor denen, die alleine schon auf Ausdrücke wie "(void)" oder Code pochen, der nicht wenigstens grundlegend den C++ Standard entspricht, dies ändert aber nichts daran das damit den Lernenden nicht geholfen wird).

    Leider sind die Professoren teilweise sehr praxisfern, und ruhen sich auf ihren Leistungen aus (Der erste C++ Standard ist wie gesagt ca. 14 Jahre alt - da darf man schon annehmen das dieser auch mal langsam zu den Professoren durchkommt).



  • sunny89 schrieb:

    Naja, das Programm nennt sich irgendwie DevC++, aber es würde mich nicht wundern... Also wenn ich versuche mein Programm zum Laufen zu bringen, dann erhalte ich folgende Meldung:

    no matching function for call to `Naehrmittel::Naehrmittel(int, const char[5], double, int, double, double)'
    candidates are: Naehrmittel::Naehrmittel(const Naehrmittel&)
    Naehrmittel::Naehrmittel(int, float, float)
    Naehrmittel::Naehrmittel()

    Die Meldung solltest du dir nochmal genau durchlesen, sie sagt ausnahmsweise mal sehr genau was dein Fehler ist.

    Du willst mit "Naehrmittel(1, "Mehl", 1.19, 300, 0.2, 0.05)" ein solches anlegen, es gibt aber keinen Konstruktor der Klasse "Naehrmittel" bei dir der 6 Parameter annimmt.

    Was du suchst ist ein Konstruktor wie der folgende:

    class Artikel
    {
      public:
        Artikel(int artikelNr, char *name, float preis);
    };
    
    class Naehrmittel : Artikel
    {
      public:
        Naehrmittel(int artikelNr, char *name, float preis, int kalorien, float eiweiss, float fett)
        : Artikel(artikelNr, name, preis),
          Kalorien(kalorien),
          Eiweiss(eiweis),
          Fett(fett)
        {
        }
    };
    


  • 314159265358979 schrieb:

    Untertreib mal nicht. 99% aller Professoren. 😞

    Weiß derjenige so genau zu beurteilen, der noch nie eine Uni von Innen gesehen hat.



  • Du weißt, dass ich Recht hab, also spar dir deinen Post und verzieh dich in das Loch, aus dem du hergekommen bist.



  • asc schrieb:

    Leider sind die Professoren teilweise sehr praxisfern, und ruhen sich auf ihren Leistungen aus

    Inwiefern ruht sich ein Physikprof auf seinen Leistugnen aus, wenn er dazu verdonnert wird, völlig fachfremd eine GDI-Veranstaltung zu lehren? Die Situation ist irgendwie der Normalfall, insbesondere bei Universitäten die keine eigene Fakultät für Informatik haben. Oder verlangst du, dass ein prof in allen Fachbereichen wegweisende Leistungen vorweisen können muss?


Anmelden zum Antworten