Funktion gibt nur Null aus
-
Ich habe eine Klasse Rechteck in c++. Die Klasse wird durch Kiste erweitert. Wenn ich mir das Volumen ausgeben lasse kommt immer Null raus. Woran kann das liegen?
class Rechteck { protected: int a; int b; public: Rechteck(int A=1, int B=1){a=A; b=B;} public: int Flaeche () {return a*b;} ~Rechteck(){} }; class Kiste:public Rechteck { protected: int h; public: Kiste(int a=1, int b=1, int h=1){}; int Volumen () {return a*b*h;} ~Kiste(){} void groesse() { cout<< "Volumen ist: "<< a*b*h<<endl; }; };
-
Konstrukotr Kiste musst du den Konstruktor de Basis klasse aufrufen (A), zu den must du die membervariable h in Rechteck über konstrukor zuweisen (B):
Ersetze Zeile:
Kiste(int a=1, int b=1, int h=1){};mit Zeile:
Kiste(int a=1, int b=1, int h=1) : /* (A) */Rechteck(a,b){ /* (B) */this->h=h; };P.S: Google mal nach Initialisierungsliste - Konstruktor
-
class Rechteck { protected: int a; int b; public: Rechteck(int A=1, int B=1){a=A; b=B;} public: int Flaeche () {return a*b;} ~Rechteck(){} }; class Kiste:public Rechteck { protected: int h; public: Kiste(int a=1, int b=1, int h=1) : Rechteck(a, b) //Konstruktor der Basisklasse aufrufen { this->h = h; } int Volumen () {return a*b*h;} ~Kiste(){} void groesse() { cout<< "Volumen ist: "<< a*b*h<<endl; }; };
-
Vielen Dank für eure schnelle Hilfe. habe jetzt nur das Problem, dass immer 6 als Ergebnis rauskommt. Egal wie ich die Werte ändere
-
Wie kommst du darauf Kiste von Rechteck abzuleiten. "Eine Kiste ist ein Rechteck" ist imho Unfug. Sogar "Ein Quadrat ist ein Rechteck" geht nicht, da ein Quadrat weniger Manipulationsmöglichkeiten als ein Rechteck anbietet...diesen Fall hast du hier zwar nicht, aber trotzdem...
Seis drum, hier sollte nicht immer 6 rauskommen:
class Rechteck { protected: int l, b; public: Rechteck (int l, int b) : l(l), b(b) {} int flaeche () { return l * b; } // alleine das hier gibts ja bei der kiste nicht mehr in der form... }; class Kiste : public Rechteck // ich nix einverstanden { protected: int h; public: Kiste (int l, int b, int h) : Rechteck(l,b), h(h) {} int volumen () { return l*b*h; } }; ... int main () { Kiste kiste (4, 4, 4); cout << kiste.volumen(); << endl; // sollte 64 ausgeben }MfG SideWinder
-
Ja hast recht so funzt es. Nur das Semikolon ist zu viel
cout << kiste.volumen(); << endl; // sollte 64 ausgebenIch wollte halt versuchen vor der main methode den Wert fürs Volumen schon auszugeben.
Was meinst du damit:
class Kiste : public Rechteck // ich nix einverstandenGibt es noch eine besser Möglichkeit eine zuvor definierte Klasse einzubinden?
-
thadre schrieb:
Gibt es noch eine besser Möglichkeit eine zuvor definierte Klasse einzubinden?
Hast Du in Sides Post auch den Text vor dem Code gelesen?

Er meint vermutlich, dass er nicht einverstanden ist, dass eine Kiste ein Rechteck ist (Ableitung == ist-ein Beziehung)
-
Die Diskussion war schon mal in nem Thread. Bspw. 3D objekte von 2D Objekten ableiten:
Bspw: (Ist zawr Plausibel aber nich elegant genug):
class ZweiDimensional int x,y; }; class DreiDimensional : public ZweiDimensional{ int z; };Meine Vorschlag (Vereinfacht):
class NDimensionen{ int *iN; //Array mit N-Dimensionen }; class ZweiDimensionen : public NDimensionen ZweiDimensionen(int x,int y) { iN= new int[2]; iN[0]= x; iN[1]= y; } }; class DreiDimensionen : public NDimensionen{ DreiDimensionen(int x,int y,int z) { iN= new int[3]; iN[0]= x; iN[1]= y; iN[2]= z; } };etc.
-
Erscheint mir auf den ersten Blick langsam und umständlich wegen Speicherverwaltung. Nene, Rechteck ist ein GraphicsObject und Quader, Box, Prisma oder was auch immer ist ein GraphicsObject. Aber die leiten sich allesamt nicht ab.
MfG SideWinder
-
zum vorschlag vom BorisTheBlade
:
das ist aber imho nicht so schön, wenn du die ganzen daten von den objekten irgendwo auf dem heap abspeicherst. zum einen, weil du da vier bytes mehr für einen unnötigen pointer benötigst, zum anderen, weil man das nicht mehr vernünftig "in einem block" auf dem speicher kriegt: Wenn du ein array aus tausend "DreiDimensionen" erstellst, werden all die "new" unabhängig voneinander aufgerufen => speicher wird möglicherweise ungünstig fragmentiert.Ausserdem macht das alles sowieso wenig sinn... Was haben denn diese klassen gemeinsam? Eigentlich gar nichts ausser einem überflüssigen zeiger... :p
\edit: mit der bemerkung über den speicher war SideWinder wieder mal schneller

-
man man, wann kommt mal der Tag, an dem ihr sagt: "Wow, gute idee Boris"
