Strukturen vererben?
-
Hallo
ich hab mehrere strukturen die ich öfter in verschiedenen klassen nutze.
Da ich nun langsam anfange abstrakte klassen zu schreiben, wollte ich fragen, ob man auch strukturen in einer abstrakten klasse festhalten kann um sie dann später zu vereben.Da ich es leid bin immer die strukturen in die jeweiligen klassen zu kopieren.
Hab dazu bei google nicht wirklich was gefunden.
Danke euch
Bis denne
-
struct und class sind unter C++ gleich, mit der Ausnahme der default Sichtbarkeit der Member (struct -> public, class -> private).
Du kannst also auch structs Vererben.
Ich nehme für Interfaces (nur pure virtual functions) immer structs um mir das public zu sparen.
Simon
-
Danke dir. Hat jetzt geklappt.
Ich hab noch ne kleine andere Frage.
Nur um sicher zu gehen.Wenn ich eine Klasse habe, die von einer anderen erbt:
class Auto : public Fahrzeug //Klasse {...};
Dann schreib ich doch nur in der Header-File
class Auto //Header {...};
Im Header muss ich also nicht mehr explizit auf die Vererbung hinweisen.
Weil so gehts jetzt! Ich wollte nur nochmal sicher gehen, ob alles mit rechten Dingen zugeht.Danke euch
Grüzli
-
Ich verstehe deine Frage nicht ganz aber die Vererbung musst Du genau einmal und zwar bei der Klassendefinition angeben (und die steht wo immer sie stehen mag, meistens in einem Header File)!
Simon
-
theta schrieb:
Ich verstehe deine Frage nicht ganz aber die Vererbung musst Du genau einmal und zwar bei der Klassendefinition angeben (und die steht wo immer sie stehen mag, meistens in einem Header File)!
Nicht Definition sondern Deklaration, und die ist, falls die Klasse in anderen Units verwendet werden soll, natürlich in nem Header. Und darum ist das gepostete Besipiel definitiv falsch, wenn ein Auto auch wirklich ein Fahrzeu sein soll.
class Auto : public Fahrzeug {...};
MUSS es dann sein! Wenn du Fehler bekommst bitte diese posten und etwas mehr Code
-
@l'abra d'or:
class A; // Klassen Deklaration class A // Klassen Definition { void f(); // Memberfunktions Deklaration }; void A::f() // Memberfunktions Definition { } // etc.
Simon
-
Also das irritiert mich jetzt.
Wenn ich schreibe:
Meine abstrakte Klasse:
/*ABSTRACT CLASS*/ class Fahrzeug { Fahrzeug(); ~Fahrzeug(); void virtual fahren(); }; Fahrzeug::Fahrzeug(){} Fahrzeug::~Fahrzeug(){} void Fahrzeug::fahren(){..}
Meine Unterklasse, die von Fahrzeug erbt:
/*CLASS*/ #include "Fahrzeug.h" class Auto : public Fahrzeug { void funktion(); }; void Auto::funktion(){ ... fahren() }
mein zugehöriger Autoheader (Bitte Kommentar lesen)
/*HEADER*/ class Auto{ // wenn ich hier noch ":public Fahrzeug" hinzufüge kommt ein Fehler // und zwar error: expected class-name before '{' token // wenn ich es weglasse ist alles ok // so wie ihr sagt muss man aber im header die Verebung mit einfügen void funktion(); };
Bin jetzt verwirrt. Ist das jetzt richtig? Klar, es funktioniert im Moment, möchte aber nicht dass sich im Programmierverlauf irgendwelche logischen Fehler einschleichen.
Danke euch
-
Also das irritiert mich jetzt.
Wenn ich schreibe:
Meine abstrakte Klasse:
/*ABSTRACT CLASS*/ class Fahrzeug { Fahrzeug(); virtual ~Fahrzeug(); void virtual fahren(); }; Fahrzeug::Fahrzeug(){} Fahrzeug::~Fahrzeug(){} void Fahrzeug::fahren(){..}
Meine Unterklasse, die von Fahrzeug erbt:
/*CLASS*/ #include "Fahrzeug.h" class Auto : public Fahrzeug { void funktion(); }; void Auto::funktion(){ ... fahren() }
mein zugehöriger Autoheader (Bitte Kommentar lesen)
/*HEADER*/ class Auto{ // wenn ich hier noch ":public Fahrzeug" hinzufüge kommt ein Fehler // und zwar error: expected class-name before '{' token // wenn ich es weglasse ist alles ok // so wie ihr sagt muss man aber im header die Verebung mit einfügen void funktion(); };
Bin jetzt verwirrt. Ist das jetzt richtig? Klar, es funktioniert im Moment, möchte aber nicht dass sich im Programmierverlauf irgendwelche logischen Fehler einschleichen.
Danke euch
-
Nice Doppelposting. Wie soll das Programm funktionieren wenn doch ein Error kommt, wie du meintest? Weiss die Klasse Auto denn das Klasse Fahrzeug existiert?
-
Fahradfahrer schrieb:
Meine abstrakte Klasse:
/*ABSTRACT CLASS*/ class Fahrzeug { Fahrzeug(); ~Fahrzeug(); void virtual fahren(); };
Die Klasse ist nicht abstrakt, sie besitzt keine rein virtuellen Funktionen.
Meine Unterklasse, die von Fahrzeug erbt:
[...]
mein zugehöriger AutoheaderWie jetzt? Ich denke, die abgeleitete Klasse
Auto
ist im Auto-Header? Auf jeden Fall hast du mich jetzt ein wenig verwirrt, könntest du nochmals kompilierbaren Code (wichtig, also auch keine Strichpunkte nach Anweisungen vergessen!) posten, und zwar jeweils mit Angabe der Datei und allen Includes?
-
Das zweite Posting ist das Richtige.
Da ich beim ersten Posting"virtual"
beim Destruktor bei der Fahrzeugklasse vergessen hatte.Der Code funktioniert, WENN ich beim Auto-Header
:public Fahzeug
(also die Vererbung) weglasse.
Deshalb hatte ich ja beim Auto-Header geschrieben, dass man den Kommentar im Code liest.
Also nochmal:
Wenn ich die Vererbung NUR beim Auto-Header weglasse funktionert der Code!
Wenn ich die Vererbung beim Auto-Header hinzufüge wird NICHT compiliert.Ich hoffe, dass es jetzt klar ist.
-
Fahradfahrer schrieb:
Deshalb hatte ich ja beim Auto-Header geschrieben, dass man den Kommentar im Code liest.
Den habe ich gelesen.
Fahradfahrer schrieb:
Wenn ich die Vererbung NUR beim Auto-Header weglasse funktionert der Code!
Wenn ich die Vererbung beim Auto-Header hinzufüge wird NICHT compiliert.Das war mir auch klar, das hast du ja bereits gesagt. Mir ging es darum, Näheres über dein Problem zu erfahren, nicht dass du dich wiederholst.
Damit du verstehst, was ich meine: Ich finde es merkwürdig, dass du schreibst:
"Meine Unterklasse, die von Fahrzeug erbt:", dann die KlasseAuto
zeigst und nachher noch von dem zugehörigen Auto-Header sprichst und nochmals eine Klassendefinition vonAuto
zeigst. Ist die KlasseAuto
nicht im Auto-Header, hast du zwei Klassen namensAuto
oder was soll ich jetzt glauben?Um hier Klarheit zu schaffen, meinte ich, ein eindeutiger Code mit Angabe der Dateien wäre besser geeignet.
-
Das KANN nicht kompilieren!!!
Farzeug::fahren() ist PRIVATE! da es in Auto keine Implementierung gibt wird das aus Fahrzeug genommen, darauf hat Auto aber keinen Zugriff!
Also BITTE BITTE BITTE keine verkürzten Beispiele, sondern etwas, das man sich per Copy&Paste in den Editor knallt und kompiliert. Denn in deinem Code sehe ich keinen Fehler, der muss wo anders passieren...