Klassen prototypen



  • hi beisammen,
    vl kennt ihr ja das Problem, wenn zweit Klassen miteinander verknüpft sind der kompiler immer eine komponente nicht kennt
    (in ungefähr so:)

    class a
    {
    void blub (b*ptr){}
    };
    
    class b
    {
    void blab(a*ptr){}
    };
    

    lässt sich aber ja mit

    class a;
    class b;
    

    davor beheben...
    nun funzen aber leider die subklassen nicht mehr

    class c : public a
    {
    };
    

    Fehlermeldung: expected class-name befor '{' token...
    weiß jemand, wie man das umgeht??
    thx in advance
    TGM



  • Kannste das n bisschen spezifizieren?

    class a;
    class b;
    
    class a
    {
    void blub (b*ptr){}
    };
    
    class b
    {
    void blab(a*ptr){}
    };
    
    class c : public a
    {
    };
    

    funzt einwandfrei...



  • die klassen sind, das hätte ich wohl sagen müssen in einzelnde h files aufgespaltet(nur in h files, keine c files...)

    a.h:

    #ifndef aaaa
    #define aaaa
    
    #include "b.h"
    
    class b;
    
    class a
    {
    void blub (b*ptr){}
    };
    
    #endif
    

    b.h

    #ifndef bbbb
    #define bbbb
    
    #include "a.h"
    
    class a;
    
    class b
    {
    void blub (a*ptr){}
    };
    
    #endif
    

    c.h

    #ifndef cccc
    #define cccc
    
    #include "a.h"
    
    class a;
    
    class c : public a
    {
    };
    
    #endif
    


  • Du solltest auf includes in Headern soweit möglich verzichten.
    In a.h und b.h ist das möglich, dort reicht die Vorausdeklaration.
    Bei c.h ist es nötig, da du von a erbst.



  • jo.. das stimmt, man kan bei a&b die includes weglassen, aber ansonnsten ändert sich nichts... der fehler taucht trotzdem auf..
    (wx DEVC++ mit g++)



  • TGM schrieb:

    jo.. das stimmt, man kan bei a&b die includes weglassen, aber ansonnsten ändert sich nichts... der fehler taucht trotzdem auf..
    (wx DEVC++ mit g++)

    kann != sollte. Was du mit a und b baust sind zirkuläre Abhängikeiten. Ausserdem erhöht das die Kompilierungsdauer, wenn du in Köpfen inkludierst.
    Der Fehler sollte aber mit dem Beispiel was du postest nicht auftauchen. Sicher hast du keine ";" vergessen?



  • ja...
    sicher nicht.. habs unabhängig 2 mal ausprobier.. nach einfachem entfernen des
    : public a
    läufts wunderbar
    weglassen ist nicht sooo wichtig, da ja die files nach dem ersten mal sowiso nicht mehr inkluded werden, siehe #ifndef

    das bissle langsamer kompelieren ist nicht von bedeutung...



  • Habs jetzt copy&pasted und es kompiliert einwandfrei und tut auch was es soll - nichts.
    Du musst irgendwoanders den Fehler haben. Poste doch bitte ein Minimalbeispiel, weo der Fehler auftritt

    TGM schrieb:

    das bissle langsamer kompelieren ist nicht von bedeutung...

    Jetzt noch nicht, bei grösseren Projekten schon. Machs doch einfach zum guten Stil. 🙂



  • TGM schrieb:

    ...

    class a;
    
    class c : public a
    

    ...

    Soweit ich weiß, reicht eine forward-Deklaration nicht aus, wenn man ableiten will - dazu muss der Compiler die Klassendeklaration sehen.

    Gruß,

    Simon2.



  • jo.. das mit dem forward declarieren stimmt, deshalb #include "a.h" darüber^^
    hab das problem jetzt behoben... backup laden, alles nochmal, diesmal überlegter mit header includes umgegangen und schon funzt es... ich hab keine ahnung worann es gelegen hat...

    aber noch ne andere frage:

    ich hab ne superklasse, im namespace ORCA::CORE, die eine virtuelle funktion getPixel() besitzt. könnte es sein, das es probleme gibt, wenn die subklasse in nem anderen Namespace steht??
    weil da eine Fehlermeldung kommt,
    unknow funktion getPixel(intersection intersec&, scence* world&)
    kandidates are getPixel(intersection intersec, scence* world)

    dieses komische "&" danach bekomme ich nicht weg?? ich hab leider auch keine ahnung was der bedeutet(und nein, das referenz & steht davor, das übergeben einer referenz anstelle eines pointers ändert nichts, dann kommt:
    unknow funktion getPixel(intersection intersec&, scence& world&)



  • Zeig doch mal etwas mehr Code (sprich - sowohl die Basisklasse als auch die abgeleitete Klasse). Die Fehlermeldung sieht für mich so aus, als ob du bei der Deklaration und der zugehörigen Methodendefinition unterschiedliche Parameter angegeben hast.


Anmelden zum Antworten