headerdatein bei kindklassen
-
Hallo,
ich weiß nicht ob das hier so rein passt, aber ich bekomm den Fehler einfach nicht raus, und hoffe mal, dass ihr mir helfen könnt.
Ich habe 3 Klassen, eine Bibliothek, ein Gattertyp und ein FlipFlop.
die Bibliothek hat ein Vector vom Typ <Gattertyp*>. Und das FlipFlop ist eine
Kindklasse vom Gattertyp.Wie muss es das jetzt mit den Headern machen?
In den Vector der Klasse Bibliothek müssen auch Adressen von Flipflops stehen. Also so was:Gattertyp* _gatter = new FlipFlopIn meinem Bibliotheks header, habe ich den Gattertyp- Header eingebunden. Und im FlipFlop- Header habe ich den Gattertyp- header eingebunden (weil ich ja vom gatter erben muss).
Das Problem ist jetzt, meine Bibliothek muss ja auch wissen dass es FlipFlops gibt. Wenn ich also den FF- Header im Bib- Header einbinde kommen die Fehlermeldungen: GatterTyp: class Typneudefinition, und Gattertyp: Basisklasse undefiniert.
Wenn ich den header jedoch im Gattertyp einbinde, kommt eine Fehlermeldung "zu viele Header". die binden sich wohl immer wieder selbst ein.
Wäre toll wenn mir da jemand helfen kann.
hier noch die header:
#include "gattertyp.h" #include <vector> #include <string> #include <fstream> //#include "flipflop.h" using namespace std; class Bibliothek { public: Bibliothek(); ~Bibliothek(); Bibliothek(string pfad); string getPfad(){return datei;}; GatterTyp* getBibElement(string typ); void dateiAusgabe(); void dateiAuswerten(); bool pfadEinlesen(string pfad); private: vector<GatterTyp*> bibElemente; string datei; void openError(); void readError(); };#include "gattertyp.h" class Flipflop : public GatterTyp { public: Flipflop(); ~Flipflop(); bool getIsFlipFlop(); short getSetupTime(){return setupTime;}; short getHoldTime(){return holdTime;}; short getLastKapazitaetClock(){return lastKapazitaetClock;}; void setSetup(short st){setupTime=st;}; void setHoldTime(short ht){holdTime = ht;}; void setLastKapazitaetClock(short lkc){lastKapazitaetClock=lkc;}; private: short setupTime; short holdTime; short lastKapazitaetClock; };#include "gattertyp.h" class Flipflop : public GatterTyp { public: Flipflop(); ~Flipflop(); bool getIsFlipFlop(); short getSetupTime(){return setupTime;}; short getHoldTime(){return holdTime;}; short getLastKapazitaetClock(){return lastKapazitaetClock;}; void setSetup(short st){setupTime=st;}; void setHoldTime(short ht){holdTime = ht;}; void setLastKapazitaetClock(short lkc){lastKapazitaetClock=lkc;}; private: short setupTime; short holdTime; short lastKapazitaetClock; };
-
edit: Falsch geguckt. Fehlende Includeguards ist das Problem.
stefanxy93 schrieb:
In den Vector der Klasse Bibliothek müssen auch Adressen von Flipflops stehen.
Um Zeiger auf einen Typen zu definieren reicht eine Vorwärtsdeklaration. Es ist keine vollständige Definition des Typen nötig. So brichst du dein rekursives Include auf.
Also so was:
Gattertyp* _gatter = new FlipFlopIch hoffe, du überträgst nicht wirklich einem rohen Zeiger Objektverantwortung, sondern dass dies nur ein Beispiel ist.
-
#include "gattertyp.h" #include <vector> #include <string> #include <fstream> using namespace std; class Flipflop; class Bibliothek { public: Bibliothek(); ~Bibliothek(); Bibliothek(string pfad); string getPfad(){return datei;}; GatterTyp* getBibElement(string typ); void dateiAusgabe(); void dateiAuswerten(); bool pfadEinlesen(string pfad); private: vector<GatterTyp*> bibElemente; string datei; void openError(); void readError(); };wenn ich das so mit vorward deklaration mache, kommt die meldung, dass kein standartkonstruktor gefunden wurde.
In der Methode DateiAuswerten von der der Bib, lese ich auch einer txt datei infos. Wenn ich dann ein FF finde muss ich ein Objekt vom Typ FF erstellen, ein paar werte setzen und die adresse in dem vektor bibElemente speichern.
if (name == "dff") { //es handelt sich um das d ff GatterTyp* _dff = new Flipflop; }Mit Vorwarddeklaration kommt der oben genannte Fehler.
Ich hoffe, du überträgst nicht wirklich einem rohen Zeiger Objektverantwortung, sondern dass dies nur ein Beispiel ist.
ich glaube schon, dass es so verlangt ist.
-
Im Vorraus möchte ich darauf hinweisen, dass SeppJ die richtige Antwort doch schon gegeben hat: in C++ ist es Standart Header mit entsprechenden Include-Guards zu versehen. Diese fehlen bei dir.
-
Mit Vorwarddeklaration kommt der oben genannte Fehler.
Ich fürchte, du verstehst nicht, wann genau Typen deklariert oder aber definiert sein müssen.
Eine Vorwärtsdeklaration gibt nur einen Namen bekannt. Wenn du eine Klasse Foo per
struct Foo;deklarierst, dann weiß der darauffolgende Code: Es gibt eine Klasse
Foo. Das Problem ist aber, dass du Foo nicht definiert hast. Das heißt, du kannst keine Objekte vom TypFooerzeugen, denn der Code weiß ja nicht einmal, welche Konstruktoren vorhanden sind.Damit du Objekte mit Typ Foo erzeugen und verwenden kannst, muss Foo also definiert sein. Das Erzeugen und Verwenden selbst aber gehört ja nicht in die Header-Datei, sondern in die Implementierung, also in irgendeine Source. Was du also tust, ist Vorwärts-Deklaration, Klassen-Definition und Memberfunktionen-Definition so auszulagern:
/// Header-Datei von Bibliothek ___________________________________________ class FlipFlop; class Bibliothek { // Definition von Bibliothek }; /// Header-Datei von FlipFlop _____________________________________________ class FlipFlop { // Definition von FlipFlop }; /// Source-Datei von Bibliothek ___________________________________________ #include "Bibliothek.h" #include "FlipFlop.h" // Definition aller Memberfunktionen
-
Die Änderung meiner ersten Antwort, woran es wirklich liegt, eine Minute nach Abschicken meiner ersten Antwort hast du gesehen?
wenn ich das so mit vorward deklaration mache, kommt die meldung, dass kein standartkonstruktor gefunden wurde.
Um im Code ein konkretes Objekt zu erzeugen reicht auch keine Forward-Declaration mehr aus, dafür brauchst du die vollständige Definition. Mit der Forwar-Declaration kannst du aber die Zeiger in der Headerdatei beschreiben. Für den konkreten Code musst du später alle nötigen Header einbinden.
Ich hoffe, du überträgst nicht wirklich einem rohen Zeiger Objektverantwortung, sondern dass dies nur ein Beispiel ist.
ich glaube schon, dass es so verlangt ist.
if (name == "dff") { //es handelt sich um das d ff GatterTyp* _dff = new Flipflop; }Das ist dann eher ... ungünstig. Wie lernst du C++? Hast du früher mal Java oder ähnliche Sprachen gemacht und lässt dich von Erfahrungen dort leiten?
-
so hat das mein Übungsleiter gemacht.
wie binde ich dann aber den header in die bib-datei ein? denn im moment kennt die FF -> Gatter
Bib -> Gatter
aber niemand kennt das FF. egal wie ich es ja einbinden will, es kommen immer die felher
-
Lies die Antworten bitte vollständig und aufmerksam. Es wurde schon gesagt, das Includeguards fehlen.
stefanxy93 schrieb:
so hat das mein Übungsleiter gemacht.
Einer von diesen Kursen.

Da ist es auch nicht so verwunderlich, dass ihr keine Includeguards kennt. Ich habe neulich sogar jemandem, der seit über 2 Jahren C programmiert, erklären müssen, was da ist.Was ich damit sagen will: Da ist nicht so gut, was ihr da lernt. Vermutlich, weil der Lehrer nicht besser kann.