P.roblem s.olved :)
-
c.groupe schrieb:
Diese Aufgabe ist ähnlich der ersten.
Das Problem liegt in Zeile 58 der artikel.cpp
wieso erkennt er nicht die VP_Felge und VP_Rad ?Du meinst wohl eher: "wieso erkennt er nicht die VP_Felge und VP_Reifen ?"
Antwort: Woher soll das Rad sie kennen, es hat in deiner Struktur nichts mit Felge und Reifen zu tun.
Ein passendes Klassendesign:
Reifen, Rad und Felge sind Artikel -> public erben von Artikel
Ein Rad hat einen Reifen und eine Felge -> Reifen und Felge als member in Rad
-
Zeig doch mal dein Aufgabenblatt, ich denke es könnte sich um mehrfache Vererbung und friends handeln,
Ach und noch was: Wenn du friend deklarierst, dann kann immer nur der zugreifen der als friend deklariert wurde aber nicht umgekehrt!
Also bei dir:
Reifen und Felge dürfen auf Rad zugreifen,
aber du möchest das Rad auf Reifen und Felge zugreifen kann!du müsstest also friend in Reifen und Felge für Rad definieren damit Rad Zugriff auf private Elemente der Klassen hat.
-
DeepCopy schrieb:
Also bei dir:
Reifen und Felge dürfen auf Rad zugreifen,
aber du möchest das Rad auf Reifen und Felge zugreifen kann!du müsstest also friend in Reifen und Felge für Rad definieren damit Rad Zugriff auf private Elemente der Klassen hat.
Das nützt aber nichts, da Reifen Rad und Felge in seinen Code keinerlei Beziehung haben, außer dass sie von Artikel erben. Da der Preis keine statische Objekteigenschaft von Reifen und Felge ist, ist dann gar nicht klar, welche Preise Rad überhaupt nehmen soll. Daher muss irgendwie eine Beziehung hergestellt werden.
-
Das weiß ich SeppJ
oder sieht mein Source-Code sooo.. NOOB-mässig aus, ausserdem hast du das Probem doch schon längst gut erklärt. :p
-
Hier die aufgabenstellung, aber nicht flamen wegen der schlechten quali, habe Aufgabe leider nicht auf dem pc gehabt..
-
c.groupe schrieb:
Hier die aufgabenstellung, aber nicht flamen wegen der schlechten quali, habe Aufgabe leider nicht auf dem pc gehabt..
Da ist ja alles bereits ganz genau vorgegeben, du musst nur Schritt für Schritt durchgehen. Jedoch scheinst du einiges nicht richtig umgesetzt zu haben:
class Artikel { protected: // In der Aufgabe steht öffentlich -> public char Name[17]; double Einkaufspreis; int Anzahl; public: virtual void einlesen(); // Taucht nirgends in der Aufgabe auf. Klassen modellieren Dinge. Du möchtest ein Modell für einen Artikel. Hast du jemals das Wort 'Artikel' sinnvoll mit dem Wort 'einlesen' in Verbindung gebracht? virtual void Verkaufspreis()=0; // Verkaufspreis sollte wohl eher double und nicht void sein }; class Felge : public Artikel { private: // Wird aus der Aufgabenstellung nicht klar, ob öffentlich oder nicht. Vermutlich soll es öffentlich sein. char Material;; // Man könnte besser ein enum verwenden (falls du das schon kennst), damit wirklich nur Stahl und Alu gewählt werden können public: double VP_Felge; // Wozu soll das gut sein? Der Preis wird doch schon geerbt! virtual void einlesen(); // Siehe oben zum Thema einlesen virtual void Verkaufspreis(); // void -> double }; class Reifen : public Artikel { private: char Dimension[9]; // soll vermutlich wieder öffentlich sein public: double VP_Reifen; // siehe oben virtual void einlesen(); // siehe oben virtual void Verkaufspreis(); // void -> double }; class Rad : public Artikel { public: double VP_Rad; // siehe oben friend class Felge; // Hier sollen nach Aufgabenstellung eigene Datenfelder vom Typ Felge und Reifen hin, anstatt der friends friend class Reifen; // Und das wäre auch sinnvoll, weil es die Quelle deiner Probleme ist virtual void einlesen(); virtual void Verkaufspreis();// void -> double };
dann musst du nur noch jeweils Verkaufspreis() für Rad, Reifen und Felge implementieren und eine passende main erstellen. Versuch das mal und wenn etwas nicht klar ist, fragst du wieder.
-
Dort steht doch explizit, daß in der Klasse Rad noch je ein privates Datenfeld (Element) der Klasse Felge sowie der Klasse Reifen angelegt werden muß. Und friend brauchst du hier nicht.
Und die Funktion Verkaufspreis() solltest du noch abändern, so daß der Preis auch zurückgegeben wird, denn dann kanst du diese Funktion auch innerhalb von Rad.Verkaufspreis für die Elemente vom Typ Felge und Reifen aufrufen.
-
Aus Langeweile:
#include <iostream> class Artikel { public: char m_name[16]; double m_einkaufsPreis; int m_anzahl; virtual double verkaufspreis() = 0; }; class Felge: public Artikel { public: bool m_istStahl; virtual double verkaufspreis() { return m_einkaufsPreis * 1.5; } }; class Reifen: public Artikel { public: char m_dimension[8]; virtual double verkaufspreis() { return m_einkaufsPreis * 1.3; } }; class Rad: public Artikel { public: virtual double verkaufspreis() { return (m_felge.verkaufspreis() + m_reifen.verkaufspreis()) * 0.9; } private: Felge m_felge; Reifen m_reifen; }; int main() { Artikel *artikel[3]; artikel[0] = new Felge(); artikel[1] = new Reifen(); artikel[2] = new Rad(); for(int i(0); i != 3; ++i) { std::cout << artikel[i]->verkaufspreis() << std::endl; delete artikel[i]; } return 0; }
Alle Angaben ohne Gewähr...
-
Mizar schrieb:
...Lösung..
Och schade, der Threadersteller wirkte auf mich lernwillig, jetzt guckt er es sich bloß an und versteht es dann nur oberflächlich.
-
Und weil's so schön ist, meine Lösung gleich hinterher:
@Mizar Du hast mögl. den Materialtypen falsch interpretiert
Auch die Eingabe von 16, 8 Zeichen benötigt noch ein zusätzliches '\0'File: Artikel.hpp
#ifndef ARTIKEL_HPP_INCLUDED #define ARTIKEL_HPP_INCLUDED class Artikel { public: char Name[16+1]; // +1 Nullzeichen '\0' double Einkaufspreis; long Anzahl; virtual double Verkaufspreis() = 0; }; enum MaterialTyp {Stahl = 1, Alu}; class Felge : public Artikel { public: MaterialTyp Material; virtual double Verkaufspreis(); }; class Reifen : public Artikel { public: char Dimension[8+1]; // +1 Nullzeichen '\0' virtual double Verkaufspreis(); }; class Rad : public Artikel { private: Felge felge; Reifen reifen; public: virtual double Verkaufspreis(); }; #endif // ARTIKEL_HPP_INCLUDED
File: Artikel.cpp
#include "Artikel.hpp" /* class Felge */ double Felge::Verkaufspreis() { return Einkaufspreis * 1.5; } /* class Reifen */ double Reifen::Verkaufspreis() { return Einkaufspreis * 1.3; } /* class Rad */ double Rad::Verkaufspreis() { return felge.Verkaufspreis() + reifen.Verkaufspreis() * 0.9; }
File main.cpp
#include <iostream> #include <string> #include "Artikel.hpp" using namespace std; int main() { Artikel* artikel[3]; artikel[0] = new Felge(); artikel[1] = new Reifen(); artikel[2] = new Rad(); const string art [ ] = {"Felge", "Reifen", "Rad" }; for (int i = 0; i < 3 ; i++) { cout << "Verkaufspreis von " << art[i] << ": " << artikel[i]->Verkaufspreis() << endl; delete artikel[i]; } return 0; }
Grüssle DC
-
Gut, ich werde mir aber erstmal die tipp zu meinen fehlern anschauen, damit ich es auch beim nächsten mal verstanden habe. Hab ja noch ein paar aufgaben die ich durchgehen muss, es sind keine HA's was auch immer das sein soll.. wir lernen für einen klausur und das sind einfach aufgaben die wir uns anschauen, .. vielen vielen dank jedenfalls an alle mitwirkenden, ihr seid echt eine rießen hilfe, zumal man auch im freundeskreis selten jemand findet der c/c++ perfekt programmieren kann
..
-
SeppJ schrieb:
Och schade, der Threadersteller wirkte auf mich lernwillig, jetzt guckt er es sich bloß an und versteht es dann nur oberflächlich.
Ich konnte einfach nicht anders
DeepCopy schrieb:
@Mizar Du hast mögl. den Materialtypen falsch interpretiert
Auch die Eingabe von 16, 8 Zeichen benötigt noch ein zusätzliches '\0'Gut deine Enumeration finde ich auch besser als meine leicht missverständliche bool'sche Variable. 16, 8, Nullterminierung... ich konnte "C-Strings" noch nie leiden
c.groupe schrieb:
[...]es sind keine HA's was auch immer das sein soll[...]
-
Mizar schrieb:
c.groupe schrieb:
[...]es sind keine HA's was auch immer das sein soll[...]
Wusste garnicht, das man soviel über HAs schreiben kann. Übrigens, ich fasse die Definition so auf, das es keine HAs sind, wenn man für eine Klausur lernt. HAs sind ja eigentlich vorgegebene Pflichtaufgaben, während lernen für eine Klausur nicht Pflicht ist.
OT: Bist Du eigentlich der selbe Mizar wie im dt. SFML-Forum?
SeppJ schrieb:
Mizar schrieb:
...Lösung..
Och schade, der Threadersteller wirkte auf mich lernwillig, jetzt guckt er es sich bloß an und versteht es dann nur oberflächlich.
Irgendwie ist das aber insgesammt komisch. Diesmal machen sogar zwei Leute die HAs vor, sonst tendenziell eher niemand...
-
Mr X schrieb:
OT: Bist Du eigentlich der selbe Mizar wie im dt. SFML-Forum
Jup, genau der
-
Mr X schrieb:
Irgendwie ist das aber insgesammt komisch. Diesmal machen sogar zwei Leute die HAs vor, sonst tendenziell eher niemand...
Liegt wahrscheinlich daran, wie solche Threads sonst aussehen. Hier war die Aufgabe klar, leserlich und mit Ansatz gegeben. Da hilft man lieber als bei den üblichen wirren Beschreibungen der Aufgabenstellung voller Rechtschreib- und Grammatikfehler.