Zyklische Abhängigkeiten und Vorwärtsdeklaration



  • Hallo zusammen,

    ich bin noch reichlich unerfahren mit C++ und recht bald auf das Problem erforderlicher Vorwärtsdeklarationen gestoßen. Folgendes Listing stellt mein Problem dar:

    #include "stdafx.h"
    
    class B;
    
    class A {
     public:
      void AF(B& b) {
        b.BF();
      }
    
      void AF2() {
      }
    };
    
    class B {
     public:
      void BF(A& a) {
        a.AF2();
      }
    };
    

    Jede Klasse muss auf eine Funktion der jeweils anderen Klasse zugreifen können, sonst kann man solche Konflikte ja teilweise mit geschicktem Umsortieren der Klassendefinitionen lösen.

    Wenn ich nun versuche, das zu kompilieren, erhalte ich die Fehlermeldungen:

    Error 1 error C2027: use of undefined type 'B' forwarddeclaration.cpp 8 MeinProjekt
    Error 2 error C2228: left of '.BF' must have class/struct/union forwarddeclaration.cpp 8 MeinProjekt

    Da ich mit der Suchmaschine meines Vertrauens und den Schlüsselwörtern "cyclic dependencies use of undefined type c++" nicht wirklich was gefunden habe, wende ich mich an euch. Wie löse ich das am besten?

    Danke im Voraus,
    Stefan



  • forward deklaration reicht hier logischerweise nciht.
    es sei denn, du trennst es in *.h und *.cpp - dann reicht im header jeweils eine forward deklaration.

    allerdings sieht das (zumindest für mich^^) ein wenig komisch aus, was du dort machst^^

    PS: stdafx.h includiere ich auch immer nur im source - im header hat die imho nix zu suchen...

    bb



  • Hehe. Immer die gleichen Fragen. Gut, dass ich da einen Blog Eintrag drüber geschrieben habe:

    Definitionen und Deklarationen in C++:
    http://www.drakon.ch/?id=&offset=&mobile=0&show_entry=77

    Da wird erklärt, warum die Vorwärtsdeklaration in diesem Falle nicht reicht und wie du das ändern kannst.

    EDIT:
    Link editiert



  • Punkt 1. Das Beispiel war schlecht zusammengebastelt. Ich verwende sehr wohl für beide Klassen jeweils eine Aufsplittung in .h und .cc, die in diesem Fall relevant ist, denn

    Punkt 2. Durch simples Einbinden der .cpp-Datei in die .cpp-Datei der verwendenden Datei war das Problem zu lösen.

    Sorry für den verursachten Aufwand 🙄



  • Du bindest eine .cpp in eine andere ein?


Log in to reply