Auch Klassenverwirrung



  • nur so als Anmerkung weil ich das letztens öfters sehe:
    Was sollen diese Prefixe ala SIGI, ABC, PUHBAER und SCHNAEUZELCHEN?

    Dafür gibt es namespaces



  • Autsch

    SIGIObject.h definiert zunächst seinen Includeguard, bindet dann SIGIContainer ein.h ein. Dieser versucht SIGIObject.H einzubinden, was aber quasi nicht gemacht wird, da der Includequard davor schützt. Dann wird aber rotzdem versucht die Klasse SIGIObject zu verwenden, was nicht geht, weil sie noch nicht definiert und auch nicht deklariert wurde.

    Lass deine SIGIObject.h mal so ausehen:

    #ifndef SIGIOBJECTH
    #define SIGIOBJECTH
    
    class SIGIContainer;
    
    class SIGIObject
    {
     private:
      SIGIContainer *parent;
     public:
      SIGIObject();
    };
    #endif
    

    Und dann hör noch auf Shade!



  • Also, ich probiere es nochmal:

    also ich habe
    header Datei b.h:

    #ifndef BHH
    #define BHH
    
    #include "a.h"
    
    class b:public a      //<-- type name expected !!!!
    {
     int ii;
     public:
     int f();
    };
    
    #endif
    

    und header-datei a.h:

    #ifndef AHH
    #define AHH
    
    #include "b.h"
    
    class a
    {
     int i;
     class b *x;
     public:
     int f();
    };
    
    #endif
    

    Warum kommt in der vorgehobenen Zeile ein Fehler ????



  • ...



  • Zwei Klassen sind
    - b soll von a alles erben
    - a soll ein feld vom typ b haben
    - b soll ein feld vom typ a haben
    - und alles getrennt in dateien

    mehr nicht



  • Helium hat es schon erklärt:

    Was macht der Preprozesser beim Compilieren von A?
    Er ersetzt das #include "b.h" durch den Inhalt von b.h

    #ifndef AHH
    #define AHH
    
    #ifndef BHH
    #define BHH
    
    #include "a.h"
    
    class b:public a      //<-- type name expected !!!!
    {
     int ii;
     public:
     int f();
    };
    
    #endif
    class a
    {
     int i;
     class b *x;
     public:
     int f();
    };
    
    #endif
    

    Und jetzt wird das #include "a.h" durch den Inhalt von a.h ersetzt:

    #ifndef AHH
    #define AHH
    
    #ifndef BHH
    #define BHH
    
    #ifndef AHH
    #define AHH
    
    #include "b.h"
    
    class a
    {
     int i;
     class b *x;
     public:
     int f();
    };
    
    #endif
    
    class b:public a      //<-- type name expected !!!!
    {
     int ii;
     public:
     int f();
    };
    
    #endif
    class a
    {
     int i;
     class b *x;
     public:
     int f();
    };
    
    #endif
    

    Das könnte nun endlos so weitergehen, aber Du hast einen Guard eingebaut:

    #ifndef AHH
    #define AHH
    ...
    #endif
    

    Und da AHH schon weiter oben definiert wurde. Fällt der ganze Bereich raus:

    #ifndef AHH
    #define AHH
    
    #ifndef BHH
    #define BHH
    
    class b:public a      //<-- type name expected !!!!
    {
     int ii;
     public:
     int f();
    };
    
    #endif
    class a
    {
     int i;
     class b *x;
     public:
     int f();
    };
    
    #endif
    

    Und jetzt siehst Du, dass dort wo der Fehler auftritt a noch gar nicht definiert ist.
    Lösung:
    schreib statt:

    #include "b.h"
    

    einfach eine Vorwärsdeklaration:

    class b;
    


  • Jau,

    volltreffer, das wars, danke !



  • volltreffer, das wars, danke !

    Ja, ich weiß, hab ich dir auch von anfang an geschreiben.



  • Der Beitrag mit den Namespaces war trotzdem sehr weiterbringend !!!!



  • Der Beitrag mit den Namespaces war trotzdem sehr weiterbringend !!!!

    Ja, aber durchaus sinnvoll und ernst gemeint.

    // "sigi/object.hpp"
    namespace Sigi {
       class Object {
          ...
       };
    }
    
    // "sigi/container.hpp"
    namespace Sigi {
       class Container {
          ...
       };
    }
    
    // foo.cpp
    
    #include "sigi/container.hpp"
    
    int main ()
    {
       Sigi::Container mein_Container;
    }
    
    /* oder
    
    using namespace Sigi;
    
    int main ()
    {
       Container mein_Container;
    }
    */
    

Anmelden zum Antworten