"Basisklasse undefiniert"



  • Hallo! Ich habe ein Problem mit der Vererbung. Bei "Basisklasse undefiniert" denkt natürlich jeder gleich an "hast du die passende header includiert?", aber ganz so einfach ist es leider nicht:

    Es gibt einer class Oben und dann zwei Klassen die davon erben, Unten1 und Unten2 ( 😃 ):

    class Oben lässt sich fehlerfrei compilieren und allen Klassen haben natürlich den Aufbau

    #ifndef class_h
    #define class_h
    #endif
    

    Bei den Klassen Unten1 und Unten2 habe ich folgendes gemacht:

    #include "oben.h"
    
    class Unten1 : public Oben
    

    bzw.

    #include "oben.h"
    
    class Unten2 : public Oben
    

    Compilere ich die Klasse Oben erhalte ich dort keine Fehler, allerdings bei den anderen Klasse: class Oben sei undefiniert.

    Fällt euch spontan ein typischer Fehler ein den ich gemacht haben könnte? Oder bräuchet ihr mehr Informationen 😕

    Gruß

    F5



  • Hallo,
    kann es sein, dass du ausversehen in den Headerdateien von Unten1 und Unten2 den selben Include-Guard-Namen wie in der Headerdatei von Oben verwendet hast?



  • Hab eben nachgeschaut, dem ist nicht so.
    Hab auch schon geschaut ob ich mich vielleicht vertippt habe (groß-, kleinschreibung).

    Fällt dir sonst noch etwas typisches ein was man falsch machen könnte?



  • Ich dachte erst, du hättst vielleicht das Semikolon, am ende von Oben vergessen, aber du sagst ja, Oben alleine ließe sich problemlos übersetzen.

    Vielleicht befinden sich die Klassen in einem Namensraum und du hast dich bei dem von Oben vertippt, so dass die anderen Klassen Oben nicht finden können?



  • Hab den fehler gefunden, echt ätzend. Hab ausversehen in Oben.h eine header includiert, die wiederum unten1.h und unten2.h includiert hat.

    Darauf wurdeich aber nie hingewiesen und ich hab gesucht und gesucht...
    Jetzt hab ich in der 4 header Datei das Problem so gelöst:

    //statt
    #include "unten1.h"
    #include "unten2.h"
    
    class Unten1;
    class Unten1;
    


  • class Unten1;
    class Unten2;
    

    so gibt das auch keinen compile error^^



  • Ja ich weiß copy&paste ist verdammt böse 😃

    Ich hab jetzt aber ein neues Problem:

    Die Klasse bei der ich das

    #include "unten1.h"
    #include "unten2.h"
    

    umgeschrieben habe funktioniert nun nicht mehr.
    Wenn ich in ihr z.B. eine neue Klasse vom Typ Unten1 erstellen möchte sagt der Compiler das Unten1 keine Konstrutoren besitzt, was nicht stimmt, und schickt mich zur Deklaration, also zu

    class Unten1;

    Wie kann ich das umgehen 🙄 😞



  • wenn du class unten1; verwendest darf die klasse "oben" nur pointer oder referenzen auf die klasse besitzen, die klasse als objekt bzw in form ihrer methoden ist nicht zugänglich.



  • Das verstehe ich nicht, hier nochmal eine Übersicht des Problems:

    - Es gibt 4 Klassen,

    class Oben, class Unten1, class Unten2 und class Andere.

    - Unten1 und Unten2 erben von Oben.

    - Oben benötigt die class Andere

    - Andere benötigt die Klassen Unten1 und Unten2

    Mit Vorwärtsdeklarationen komme ich nicht weiter da ich damit dann zwar Parameter von Methoden definieren darf, aber sobald ich damit arbeiten will und sage ->MachWas() meckert der Compiler.



  • Das MachWas kannste in die cpp schieben. Dann funktioniert es. Direkt im Header kannst Du die forward-deklarierten Klassen natürlich nicht verwenden.

    MfG Jester



  • f5taste schrieb:

    Das verstehe ich nicht, hier nochmal eine Übersicht des Problems:

    - Es gibt 4 Klassen,

    class Oben, class Unten1, class Unten2 und class Andere.

    - Unten1 und Unten2 erben von Oben.

    - Oben benötigt die class Andere

    - Andere benötigt die Klassen Unten1 und Unten2

    Mit Vorwärtsdeklarationen komme ich nicht weiter da ich damit dann zwar Parameter von Methoden definieren darf, aber sobald ich damit arbeiten will und sage ->MachWas() meckert der Compiler.

    Du solltest dir hier weniger darüber den Kopf zerbrechen, wie du das kompilieren kannst sondern vielmehr wie du dieses Design ändern kannst. So ist das keine gute Sache. Du hast eine zyklische Abhängigkeit.
    D.h. egal welche Klasse du von nun an änderst, du musst jedesmal alle anderen Klassen neu übersetzen. Das Ganze ist also ein einziges große Knäul.

    Als erstes: Ist Andere wirklich von den konkreten Klassen Unten1 und Unten2 abhängig? Oder reicht vielleicht eine Basisklassenabhängigkeit?
    Damit würdest du den Zyklus zumindest schon mal auf Oben<->Andere beschränken. Was den großen Vorteil hätte, dass Oben nicht mehr indirekt von seinen eigenen Kindklassen abhängig wäre.



  • Jester schrieb:

    Das MachWas kannste in die cpp schieben. Dann funktioniert es. Direkt im Header kannst Du die forward-deklarierten Klassen natürlich nicht verwenden.

    MfG Jester

    ➡ Genau so hatte ich es, Machwas() wurde in der cpp aufgerufen

    @HumeSikkins

    die Klasse andere enthält 2 Listen, die beiden Listen sind vom Typ Unten1 und Unten2. Meinst du ich soll einfach den Typ der Listen auf "Oben" ändern?


Anmelden zum Antworten