Überkreuz Klassen verwenden



  • Hallo!

    Wie kann ich denn wenn ich 2 Klassen in 2 verschiedenen (Header)-Dateien habe, die sich gegenseitig als Membervariablen benutzen, das dem Compiler unterjubeln? Ich habe etwas in der Art:

    //Datei a.h
    #ifndef AH
    #define AH
    
    #include "z.h"
    
    class Z; //forward Deklaration
    
    class A
    {
      Z z;
    public:
      void benutzeZ()
      {
         z.tueZ();
      }
      void tueA()
      {
        //irgendwas
      }
    
    };
    
    #endif
    
    //Datei z.h
    #ifndef ZH
    #define ZH
    
    #include "a.h"
    
    class A;  //forward Deklaration
    
    class Z
    {
      A a;
    public:
      void benutzeA()
      {
         a.tueA();
      }
      void tueZ()
      {
        //bla
      }
    
    };
    
    #endif
    

    Der Compiler beschwert sich immer, dass A oder Z unbekannt wären.
    wie kann ich das lösen?



  • Willst du uns ärgern? Das kann doch garnicht funktionieren.



  • Versuch irgendwas zu verwenden, was mit einer Forward-Deklaration auskommt.



  • //bar.hh
    class foo;
    
    class bar {
      foo *foo_m;
    public:
      //denk dran copy-operator und cctor zu überladen!
      bar();
      ~bar();
      //...
    };
    
    //foo.hh
    class bar;
    
    class foo {
      bar *bar_m;
    public:
      //denk dran copy-operator und cctor zu überladen!
      bar();
      ~bar();
      //...
    };
    
    //bar.cc
    #include "bar.hh"
    #include "foo.hh"
    
    bar::bar() : foo_m(new foo) { }
    bar::~bar() { delete foo_m; }
    
    //foo.cc
    #include "foo.hh"
    #include "bar.hh"
    
    foo::foo() : bar_m(new bar) { }
    foo::~foo() { delete bar_m; }
    

    so ungefähr



  • Bin ich der Einzige, der da einen Stapelüberlauf sieht?



  • lol kingruedi 🤡



  • ich habe das gleich prob !
    bitte helft mir weiter unter borland war das immer voll ok .. in VC macht der immer nen fehler

    class CGridSquare;
    
    //--------------------------------------------------------------//
    //	klasse: CGrid
    //	beschreibung:	klasse des Prospektoren-Plans
    //--------------------------------------------------------------//
    class CGrid
    {
    	CGridSquare m_gsXCoord[80]; 
    	CGridSquare m_gsYCoord[24]; 
    
    public:
    	CGrid();
    	int CreateGrid();
    	int LoadGrid();
    };
    

    fehlermeldung

    d:\Temp\c++ work area\grab\grid.h(29): error C2079: 'CGrid::m_gsXCoord' verwendet undefiniertes class 'CGridSquare'



  • Hey, das kann ja gar ncith funzen...

    class A
    {
    B b;
    };

    class B
    {
    B b;
    }

    Wenn man das kompilieren könnte, dann würde doch die eine Klasse die andere immer wieder einbinden, und dann entstehen unendlich viele Konstruktor-Aufrufe und dann... stürzt das Prggi ab 🙂

    Versuchs mal mit Zeigern, da brauchste keine Beschreibung der Klasse.



  • Wo isn das???
    Zu ulath würd ich sagen:
    Du kannst nur definierte Klassen zurückgeben, wenn der Compiler nicht weis, was er von der Funktion zu erwarten hat kann er sie nicht durchgehen lassen.

    mfg
    Glamdring


Anmelden zum Antworten