Eingeschlossene Klasse dynamisch??



  • Hallo,

    meine Frage, wie kann ich eine Klasse dynamisch einschließen?
    Bsp: class B ist in A eingeschlossen
    also das ich nicht

    A* test=new A;
    test->B.irgendeineFunktion();
    

    sondern so:

    A* test=new A;
    test->B->irgendeineFunktion();
    

    würde mich mal interessieren:

    Und was mich auch noch interessiert:

    Ich habe in beiden Klassen eine

    int GetIt()const{return x;}
    

    diese Funktion gibt einfach nur einen Integerwert zurück..

    in der Main versteh ich das nich:

    A test;
    int a = test.GetIt();
    int b = test.B.GetIt(); //<-----da öffnet sie beim automatischen codefenster test. nur die GetIt(), und nicht B(habe Borland C++ B 6)
    

    vielleicht könnt ihr mir ja helfen



  • Könntest du vielleicht mal die Klasse Posten?

    und das bitte übersetzen:

    //<-----da öffnet sie beim automatischen codefenster test. nur die GetIt(), und nicht B

    ((was ist ein "Automatisches Codefenster"? Anscheinend steh ich tierisch auf dem Schlauch, oder es ist nur unverständlich geschrieben 😉 ))



  • Generic____ schrieb:

    A* test=new A;
    test->B.irgendeineFunktion();
    

    sondern so:

    A* test=new A;
    test->B->irgendeineFunktion();
    
    class A
    {
      pubic:
      B* b;
      A();
      void foo();
    };
    ...
    A::A()
    {
      b = new B();
    }
    ...
    A* test = new A();
    test->b->foo();
    ...
    

    Klasse B ist auch nicht in A "eingeschlossen", sondern A besitzt einen Zeiger auf eine Instanz von Klasse B.
    Von der Funktionalitaet her existiert bei deinen beiden Codeschnippeln auch kein Unterschied, was B.foo() kann kann auch B->foo() und umgekehrt. Das ganze mit einem Zeiger zu machen ist nur sauberer und (fuer mich) intuitiver.

    so far

    Phil

    P.S.:

    Woems schrieb:

    ((was ist ein "Automatisches Codefenster"? Anscheinend steh ich tierisch auf dem Schlauch, oder es ist nur unverständlich geschrieben 😉 ))

    Da stehen wir gemeinsam drauf 🤡



  • Er meint die Programmierhilfe "Code vervollständigen" des BCB. Da werden kurze Zeit nach Eingeben des Punktes die verfügbaren Member angezeigt. Wenn das bei ihm nicht der Fall ist, dann ist B evtl. private (oder die Instanz von B heißt anders etc.).
    Die Darstellung der Deklaration von A könnte hier Aufklärung bringen.



  • Also:

    Braunstein schrieb:

    Er meint die Programmierhilfe "Code vervollständigen" des BCB. Da werden kurze Zeit nach Eingeben des Punktes die verfügbaren Member angezeigt. Wenn das bei ihm nicht der Fall ist, dann ist B evtl. private (oder die Instanz von B heißt anders etc.).
    Die Darstellung der Deklaration von A könnte hier Aufklärung bringen.

    genau das mein ich....aber wenn ich es händisch hinschreibe, funktioniert es aber wunderbar! (B ist auch nicht private)

    pli schrieb:

    class A
    {
      pubic:
      B* b;
      A();
      void foo();
    };
    ...
    A::A()
    {
      b = new B();
    }
    ...
    A* test = new A();
    test->b->foo();
    ...
    

    Klasse B ist auch nicht in A "eingeschlossen", sondern A besitzt einen Zeiger auf eine Instanz von Klasse B.
    Von der Funktionalitaet her existiert bei deinen beiden Codeschnippeln auch kein Unterschied, was B.foo() kann kann auch B->foo() und umgekehrt. Das ganze mit einem Zeiger zu machen ist nur sauberer und (fuer mich) intuitiver.

    so far

    Phil

    und muss ich das nicht irgendwie wieder löschen? delete?
    manchmal im dstor von A?

    Und wieso ist das nicht eingeschlossen, stand in meinem buch so drin!
    Was ist denn dann eine eingeschlossene klasse, wenns das nicht ist??



  • und muss ich das nicht irgendwie wieder löschen? delete?
    manchmal im dstor von A?

    Ja und nicht nur manchmal, sondern immer.

    Wie oben schon gesagt hat deine Klasse nur eine Membervariable vom Typ B. Eingeschlossene Klasse würde bedeuten, dass auch die Deklaration von B innerhalb der Deklaration von A erfolgt.
    Also so etwas

    class A
    {
      public:
    
      class B
      {
         public:
         B() {}
         void bar()
         {...}
      };
    
      B *b;
      }
      A();
      void foo();
    };
    

Anmelden zum Antworten