Vererbung Rechteck auf einen Quader

Lisa123

Grünschnabel
Hallo Gemeinde,

Bin neu hier in diesem Forum also seid bitte nicht zu streng :).

Ich darf für ne gute Note über die Ferien mal was in Informatik programmieren.
Die Vererbung von einem Rechteck zu einem Quader. Nun komm ich aber seit 1 Woche überhaupt nicht mehr weiter, bin blutiger Anfänger und hab deshalb nur soviel Ahnung wie Youtube, meine Bücher und das Internet hergeben.

Nun zum Problem, ich krieg keine vernünftige Konsolenanwendung zu dem Thema hin.
So weit bin ich jetz.

Main.cpp
C++:
#include <iostream>
#include "Quader.h"


;using namespace std;

int main()
{

Rechteck Rechteck;
Quader Quader;

Rechteck.breite();
Rechteck.laenge();
Rechteck.Umfang();

Quader.hoehe();
Quader.breite();
Quader.laenge();
Quader.Umfang();
return 0;
};

Rechteck.cpp
C++:
#include <iostream>
#include "Rechteck.h"

using namespace std;

Rechteck::Rechteck()
{
laenge = 4;
breite = 2;
Umfang = 2*laenge+2*breite;


};

Rechteck.h
C++:
class Rechteck
{

public:
Rechteck();
int laenge;
int breite;
int Umfang;

};

Quader.cpp
C++:
#include <iostream>
#include "Quader.h"

using namespace std;

Quader::Quader()
{
laenge = 4;
breite = 2;
hoehe = 2;


};


Quader.h
C++:
#include <iostream>
#include "Quader.h"

using namespace std;

Quader::Quader()
{
laenge = 4;
breite = 2;
hoehe = 2;


};

Und noch die Fehlermeldung

1>------ Erstellen gestartet: Projekt: Vererbung, Konfiguration: Debug Win32 ------
1>MSVCRTD.lib(crtexe.obj) : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_main" in Funktion "___tmainCRTStartup".
1>C:\Users\Hacker\Documents\Visual Studio 2010\Projects\Vererbung\Debug\Vererbung.exe : fatal error LNK1120: 1 nicht aufgelöste externe Verweise.
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========



Würde mich riesig freuen wenn mir dabei mal jemand helfen könnte. Weil ich seit 7 Tagen die ich jetz dran saß nicht mehr weiter komme.

LG Lisa :confused:
 
Zuletzt bearbeitet:
Hi und Willkommen bei tutorials.de,

zum konkreten Fehler zuerst:
Stell vielleicht einmal das ganze Projektverzeichnis als Zip-Datei hier rein.
Da du ja eigentlich ein main hast ist da wahrscheinlich
beim Projektanlegen etc. etwas daneben gegangen.
Was hast du genau augewählt? C++: "Win32 Konsolenanwendung" (oder so ähnlich)
Gibt es noch mehr Codedateien im Projekt außer den gezeigten?

Zur Aufgabe:
Rein sinnmäßig ist da etwas seltsam.
Ein Quader ist etwas dreidimensionales, ein Rechteck nicht.
Ein Quader ist daher genaugenommen kein Rechteck
und sollte daher auch nicht davon erben.

Zum Code selbst später noch etwas, wenn das ganze einmal kompilierbar ist.
 
Vielen Dank.

Also der Quader soll die Länge und Breite erben. Neu hinzu kommt dann die Höhe womit ich das Volumen berechnen kann.
Ausgewählt ist Win32 Konsolenanwendung.
 
Zuletzt bearbeitet:
Hallo,
nachdem ich deinen Code etwas umgestaltet habe ist er bei mir ausführbar.

Ich würde dich aber bitten einfach nochmal das Projekt neu zu erstellen, denn ich weiß gerade nicht mehr wie, wo und ob es möglich ist den Projekttyp nachträglich zu ändern, aber es ist jedenfalls keien normale Konsolenanwendung.

Zu deinem Code gibt es noch einiges zu erwähnen. Erstmal den überarbeiteten Quelltext:

C++:
#include <iostream>
#include "Quader.h"
#include "Rechteck.h"
using namespace std;

int main(int argc, char **argv)
{

	Rechteck rechteck;
	Quader quader;

	cout << rechteck.breite << endl;
	cout << rechteck.laenge << endl;
	cout << rechteck.Umfang << endl;

	cout << quader.hoehe << endl;
	cout << quader.breite << endl;
	cout << quader.laenge << endl;
	cout << quader.Umfang << endl;

	getchar();
	return 0;
}

C++:
#ifndef RECHTECK
#define RECHTECK

class Rechteck
{

public:
	Rechteck();
	int laenge; 
	int breite;
	int Umfang;
	
};

#endif

C++:
#include <iostream>
#include "Rechteck.h"

Rechteck::Rechteck() 
{
	laenge = 4;
	breite = 2;
	Umfang = 2*laenge+2*breite;
}

C++:
#ifndef QUADER
#define QUADER
#include "Rechteck.h"

class Quader : public Rechteck
{
public:
	Quader();
	int hoehe;
};

#endif

C++:
#include <iostream>
#include "Quader.h"

Quader::Quader()
{
	laenge = 4;
	breite = 2;
	hoehe = 2;
}

Als erstes zu der main.cpp. Vor dem using kommt kein Semikolon, genauso wenig nach der main().
Wenn du Instanzen der Objekte Quader und Rechteck nutzt, dann solltest du diese auch anders nennen. Die Namen sind so in der Form schließlich schon für die Klassen vergeben und vorgesehen.
Was genau hast du mit "Rechteck.breite();" usw. bezwecken wollen? Ich interpretiere mal eine Ausgabe, aber dann musst du natürlich auch etwas ausgeben, in dem Falle mit cout. Die Klammern symbolisieren hier auch eine Funktion. Auf public-Variablen greift man einfach durch den Punkt-Operator zu.

Weiter zu deinen Header-Dateien. Du solltest dir früh angewohnen die so genannten "include guards" zu verwenden.

C++:
#ifndef QUADER
#define QUADER
...
#endif

Das verhindert erneutes einbinden von vorhandenen Dateien (Headern). Ist zwar nicht zwingend notwendig, aber so muss man nicht die Reihenfolge des Einbindens beachten und erspart sich einige Fehler.

Weiter zu den cpp-Dateien. Nach den Methoden muss auch kein Semikolon stehen. Semikolons stehen nur hinter Definitionen von Objekten, wie z.B. Klassen, structs, enums...

Das ist jetzt das, was mir auf den ersten Blick auffällt. Ich hoffe das Programm funktioniert, wenn du es nochmal neuerstellst.

Grüße,
Jennesta
 
Zuletzt bearbeitet:
Hallo Lisa123

Um noch kurz das von sheel weiterzuführen:
Vererbung in C++ steht für eine "is a"-Beziehung. Die erbende Klasse ist eine Basisklasse. Ein Quader ist kein Rechteck. Unabhängig davon ob es geht, machen sollst du es nicht.

Viele Grüsse
Cromon
 
Vielen Dank erstmal für die Mühe,

Ich habe die Instanzen jetz umbenannt.
Mit "Rechteck.breite();" dachte ich gibt er die Werte dann aus.

Das mit den "include guards" werde ich mir nochmal genau anschauen damit ich es auch beim nächsten mal anwenden kann.

Die "is a"-Beziehung versteh ich in dem Fall nicht ganz, es ist doch richtig das der Quader alle Attribute des Rechtecks erbt und neue hinzu bekommt (Höhe).

Danke schon mal, jetz kann ich mich weiter zum Umfang und der Fläche herantasten :).
 
Du solltest Vererbung nur bei "is a"-Beziehungen verwendet, das bedeutet, wenn das eine das andere ist.

Bsp.: Eine Katze ist ein Tier. <--- Hier ist Vererbung richtig.

C++:
class Cat : public Animal
{ 
};

In deinem Beispiel: Ein Quader ist ein Rechteck. <-- Das stimmt nicht! Ein Quader ist kein Rechteck!

Du darfst Vererbung nicht so sehen, dass du das nur anwendest, wenn du die Attribute wiederverwenden willst (so wie in deinem Beispiel). Das sollte nicht der einzige Grund sein, um Vererbung anzuwenden.

Warum nicht? Ganz einfach: Irgendwann funktioniert das nicht mehr so recht. Und du hast es schon erwähnt: Umfang und Fläche. Auch diese beiden Funktionen würde der Quader erben. Nur hat ein Quader weder Umfang noch Fläche. Er hat vielleicht eine Oberfläche, aber keine Fläche. Würdest du die Fläche-Funktionen auf deinen Quader anwenden, wäre das Ergebnis sinnlos und genau das sollte bei Vererbung nicht passieren.

Deshalb wichtig: Wenn es um Vererbung geht, ist das Wichtigste, das zählt, die "is a"-Beziehung.


Zu deiner letzten Frage: Wenn du rechteck.breite(); aufrufst, bekommst du von der Funktion den Wert zurück. Da du den Wert aber nirgends speicherst, ist er weg.

Bsp.:
C++:
int a = rechteck.breite();      // Die Breite wird in "a" gespeichert

rechteck.breite();                 // Breite wird zurückgegeben, aber nirgendwo gespeichert

cout << rechteck.breite();   // Die Breite wird an cout weitergegeben -> ausgegeben

Lg
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück