Wechselseitiger Zugriff auf Objekte



  • gute tag,

    folgendes problem. es gibt 2 klassen die wechselseitig aufeinander zugreifen müßen...

    class Klasse1
    {
      public:
      ...
         void SetKlasse2(Klasse2 *klasse2);
      private:
         Klasse2 *m_klasse2;
      ....
    };
    
    class Klasse2
    {
      public:
      ...
         void SetKlasse1(Klasse1 *klasse1);
      private:
         Klasse1 *m_klasse1;
      ....
    };
    

    funktioniert so leider nicht. hab dazu folgendes gefunden: http://www.dfv.rwth-aachen.de/doc/handout/node15.html

    leider werd ich darauß nicht ganz schlau... könnte das einer nochmal etwas einfacher erklären.

    dank im vorraus

    cya joni



  • Hallo,

    // forward-declaration
    class Klasse2;
    
    class Klasse1
    {
      public:
      ...
         void SetKlasse2(Klasse2 *klasse2);
      private:
         Klasse2 *m_klasse2;
      ....
    };
    
    class Klasse2
    {
      public:
      ...
         void SetKlasse1(Klasse1 *klasse1);
      private:
         Klasse1 *m_klasse1;
      ....
    };
    

    Schwups.



  • Das kann man so lösen:

    // Datei: klasse1.h
    #ifndef _KLASSE1_H
    #define _KLASSE1_H
    class Klasse1
    {
      public:
      ...
         void SetKlasse2(class Klasse2 *klasse2);
      private:
         class Klasse2 *m_klasse2;
      ....
    };
    #endif
    
    // Datei Klasse2.h
    #ifndef _KLASSE2_H
    #define _KLASSE2_H
    class Klasse2
    {
      public:
      ...
         void SetKlasse1(class Klasse1 *klasse1);
      private:
         class Klasse1 *m_klasse1;
      ....
    };
    #endif
    
    // Datei Klasse1.cpp
    #include "Klasse1.h"
    #include "Klasse2.h"
    
    ... und nun die Funktionen hier implementieren, z.B.
    void Klasse1::SetKlasse2(class Klasse2 *klasse2)
    {
       m_klasse2 = klasse2;
    }
    
    // Datei Klasse2.cpp
    #include "Klasse1.h"
    #include "Klasse2.h"
    
    ... dito
    

    Man kann's auch in einer Datei lösen, aber ich bevorzuge die Variante mit gesplitteten Dateien. Trick daran ist, daß man im Header nicht die Header der anderen Klasse inkludiert, sondern nur sagt: Du, das ist eine Klasse, aber mehr mußt Du im Header nicht wissen.

    Wie die andere Klasse dann aussieht, erfährt der Compiler über die Inkludierung in der cpp-Datei.

    Generell ist aber zu sagen, daß man Überkreuzverwendung nicht allzu verschwenderisch anwenden sollte, das ist oftmals mehr ein Designfehler als eine Notwendigkeit. Häufig wäre da in Wirklichkeit noch eine 3. Klasse im Spiel, oder die eine "Rückrichtung" ist überflüssig.


Anmelden zum Antworten