Kleines Designproblem bei Vererbung...



  • Hallo, ich habe wieder ein kleines Problem,

    ich habe eine Große Header main.h

    Es ist villeicht nicht ganz schön, aber durchaus effektiv, dass diese Klasse alle anderen Header, die so insgesamt benötigt werden inkludiert.
    Die anderen dateien inkludieren dann immer nur die main.h, sodass jede Datei jede kennt, dass es nicht zu einer Endlosschleife kommt liegt daran, dass alle header eine #findef-#define-#endif Konstruktion haben.
    Bisher hat es so immer funktioniert, doch jetzt habe ich ein Problem, bei dem ich nicht mehr weißterweiß.

    PSEUDO/C++:
    
    main.h
    
    #ifndef _MAIN_
    #define _MAIN_
    
    #include "base.h"
    #include "derived.h"
    
    #endif
    
    base.h
    
    #ifndef _BASE_
    #define _BASE_
    
    #include "main.h"
    
    class Base
    {
    };
    
    #endif
    
    derived.h
    
    #ifndef _DERIVED_
    #define _DERIVED_
    
    #include "main.h"
    
    class Derived : public Base
    {
    };
    
    #endif
    

    So etwa sieht die Konstruktion hier aus.
    Nun bekomme ich in der dervied.h aber den Fehler, dass Base undefiniert ist.
    Ich habe schon probiert einfacherweise die base.h zu inkludieren, class Base; in die dervied.h zu schreiben oder auch die #ifndef-#define-#endif Konstruktion wegzulassen...
    Alles ohne Erfolg, ich weiß nicht mehr weiter. 😞

    Und bitte keine Aussagen wie:
    Dein ganzes Design mit den Headern ist Schwachsinn, das stimmt nicht, es hat sich nur allzu oft bewährt und bisher immer wunderbar funktioniert und Header nur in der Quellcodedatei einzufügen ist auch nicht möglich, da man die Klassen und Strukturen ja auch als Elemente der Klasse in der Header definieren muss.

    Wie auch immer, ich hoffe jemand hat eine Idee.

    Danke im Voraus!

    MfG MAV



  • Du müsstest die base.h in der derived.h einbinden und nicht die main.h imho.

    Devil



  • Geht auch nicht, dann kennt er die Base leider auch net. 😞



  • Original erstellt von Mis2com:
    **
    Und bitte keine Aussagen wie:
    Dein ganzes Design mit den Headern ist Schwachsinn, das stimmt nicht**

    *lol* deine meinung wird sich beim zweiten compilieren ändern 😉
    wenn dan jede quellcodedatei (die main.h inkludiert) alle header mit inkludiert, die selbst auch wieder die main.h inkludieren, damit sie alle header sehen?

    in headern solltest du immer nur die header inkludieren, die du wirklich brauchst -

    //main.h - ich lass die ifndef dinger mal weg, dauert zu lange zu schreiben
    
    #include "derived.h"
    #include "base.h" /* Wenn du trotzdem du weißt, dass derived base inkludiert, das extra schreiben willst :rolling_eyes: */
    
    //base.h
    
    //nix
    
    //derived.h
    
    #include "base.h" /* Mehr brauchst du nicht */
    

    btw: bei den define sachen solltest du nicht mit dem underscore beginnen, weil ALLE Bezeichner, die mit underscore beginnen, für den compiler reserviert sind.
    irgendwann könnte sich das rächen



  • Da er in base.h die main.h inkludiert führt das auf die gleiche Ausgangssituation.

    Da ist ein Deadlock drin, ich denke gerade noch über eine geeignete Demo nach wie man das sieht.

    Was auf jeden Fall funktioniert: die Idee mit der main.h auf den Müll werfen (erhöht nur die Compilezeit des Projekts in furchtbare Größen), im Header immer nur das inkludieren was man braucht, in der cpp immer nur das inkludieren was man braucht. Fertig. Das ist die Lösung dafür.

    Apropos, irgendjemand wird Dir das noch sagen (da habe ich keine Zweifel 🙂 ), aber Du solltest keine eigenen Symbole anlegen, die mit einem _ beginnen. Also #define BASE_H statt #define _BASE_H



  • Nagut, ibnklduier ich nur das Nötigste, ändert leider nichts an meinem Problem. 😞

    EDIT:
    Das übertarge ich jetzt eben mal auf alles.
    Dann sag ich wie es dann aussieht.

    [ Dieser Beitrag wurde am 08.06.2003 um 13:21 Uhr von Mis2com editiert. ]



  • Original erstellt von Marc++us:
    blablabla...

    ähm, ja... und wie weit unterscheidet sich das von meinem tip? 🙄
    hast du dir mal nur die frage angeschaut? 😃



  • OK Leute ihr habt Recht, das war wirklich Gülle was ich da hatte, ich schreibe es jetzt um. 🙄
    Aber ob es danach klappt?

    Ein weiteres Problem ist ja, dass wenn ich die Header inkludiere, die ich brauche, ja auch Header sidn die ebenfalls andere Header inkludieren...
    Dafür sorgt dann die #findef... Konstruktion, dass nicht jeder alles inkludiert oder?

    Und wenn eine C++-Datei nun eine Header-Datei inkludiert (ihre zugehörige Headerdatei bei einer Klasse), die schon die nötige Datei inkludiert hat, die die C++-Datei auch benötigt?

    [ Dieser Beitrag wurde am 08.06.2003 um 13:34 Uhr von Mis2com editiert. ]



  • im normalfall schon



  • Original erstellt von <Tipper>:
    **ähm, ja... und wie weit unterscheidet sich das von meinem tip? 🙄
    **

    Darin, daß ich die Antwort offen hatte, getippt habe, und abgesendet nachdem Du geschrieben hast... so daß ich Deine Antwort nicht mehr lesen konnte.



  • 🙂
    kommt nur etwas seltsam, alles nochmal zu sagen 😃



  • Das ist bei mir ziemlich komplex, manche Dateien inkludieren 5 osder 6 andere Header, deswegen hatte ich gedacht es wäre besser, das mit einer Header zu machen. 😕
    Naja, ich schreibe noch um, nurnoch 256 fehler 🙂



  • Sauber, nachdem ich den Code nach euren Ratschlägen bearbeitet hatte, funktionierte es 🙂
    Super, dann kann ich ja weitermachen. ^^

    MfG MAV


Anmelden zum Antworten