Problem mit Klassenhirachie



  • Ich hab schon einen Knoten im Hirn! Also: Ich habe folgende Klassen:

    class ClassC{
      void DoSomething(void);
      ...
    }
    
    class ClassB{
      ClassC *YYY[100];
      ClassB(void)
      {
        for(int s = 0;s < 100;++s){
          YYY[s] = new ClassC();
        }
      }  
    ...
    }
    
    class ClassA{
      char *String1;
      ClassB *XXX;
      ... 
      ClassA(void)
      {
        XXX = new ClassB();
      }  
      ...
    }
    

    Zur Laufzeit wird dann folgendes Objekt erstellt:

    ClassA *A = new ClassA();
    

    So dass sich dann diese Struktur ergibt:

    A->XXX->YYY[34]->DoSomething();
    

    Nun will ich aber in DoSoemthing(), also in ClassC, auf String1 aus ClassA zugreifen. Ich habe schon versucht dem Konstruktor von ClassB das Objekt A mit Hilfe von this mitzugeben. Also so:

    XXX = new ClassB(this);
    

    ,aber ich weiß nicht so recht was für einen Typ ich da für den Parameter des Konstruktors angeben soll. Am besten wäre natürlich ClassA, aber die ist bei der Deklaration des Konstruktors von ClassB noch nicht bekannt. Ich hab's auch schon mit **void *** versucht, aber dann kriege ich immer einen Fehler, wenn ich innerhalb von ClassB auf den übergebenen Wert(Ich hab ihn mal Owner genannt) zugreife!

    class ClassB{
      ...
      void *Owner;
      ClassB(void *GetOwner){
        Owner = GetOwner;
      }
      void irgend_eine_function(void)
      {
         Owner->String1  //[C++ Error] member.hpp(236): E2288 Pointer to structure required on left side of -> or ->*
      } 
    }
    

    Hat jemand ne Idee wie ich da weiterkomme?



  • bei void weiss der Compiler nicht, um was es sich für einen Typ handelt, du musst also erst einmal casten.



  • joa aber wenn ich dann sowas in der Richtung schreibe:

    (*ClassA)Owner->String1
    

    kommt [C++ Error] member.hpp(236): E2108 Improper use of typedef 'ClassA'! Aber ich glaube mir ist da die Syntax beim Casten nich so ganz klar. Muss ich da vielleicht dynamic_cast verwenden??? 😕

    [EDIT] Uuups ich hab die falschen Klassennamen genommen. Das wollte ich euch eigentlich ersparen 😉 [/EDIT]



  • Tip: Sieh dir mal den cast an. Da stimmt was nicht...



  • aua aua meinst du das da?

    (ClassA*)Owner->String1
    

    Ich kriege immernoch eine Fehlermeldung!
    [C++ Error] member.hpp(236): E2288 Pointer to structure required on left side of -> or ->*



  • Nimm den reinterpret_cast:
    reinterpret_cast<ClassA*>(Owner)->String1;

    🙂



  • Ui danke! reinterpret_cast... noch nie gehört, aber klappt prima!



  • Ich schrieb:

    klappt prima

    Aber auch nur in der Theorie... Es lässt sich jetzt compilieren, aber ich krieg überall Exeptions! Vielleicht wäre eine Referenz da doch angebrachter! Oder noch besser ein Pointer! Gibt es nicht eine Möglichkeit die Klasse schon vor der Deklaration der anderen bekannt zu machen. Also so eine Art Prototypfür die Klasse???



  • Einfach davor:

    class Klassenname;
    

    Nun weiß der Compiler, dass es die Klasse gibt.



  • Aaahhh das macht die ganze Sache schon viel einfacher! Das erspart das umständliche Casten!


Anmelden zum Antworten