Klassenproblem



  • Ich stehe vor einem Problem won ich noch nicht einmal weiss ob es funktionieren wird.Ich versuche es mal zu erklären.
    Ich habe von einer Klasse einen Pointer auf class A der beim starten des Programmes erzeugt wird.So weit so gut.
    Nun habe ich Klasse B die von Klasse A abgeleitet ist.Jetzt kann es sein das ich zur Laufzeit die Klasse B benötige.Diese muss sich aber auf die fertige Klasse A beziehen.
    Ich hoffe das ich mich verständlich ausgedrückt habe.
    Ist dieses überhaupt möglich und weiss jemand eine Möglichkeit ??????



  • Meinst du sowas wie einen DownCast?
    Dann lies dir dochmal das hier durch.
    Hoffe das hat geholfen.

    Gruß
    Entyl Sa



  • Mit casten ist das Problem nicht grlöst.
    In der Klasse A werden weitere Instancen von anderen Klassen erstellt.Wenn ich zur Laufzeit die Klasse B benötige muss ich die Pointer von der Klasse A haben.Eine neue erstellung von Klasse A bringt mir nichts.Ich muss die Instanz der erstellten Klasse A haben.
    Ich hoffe mein Problem ist klar.

    Trotzdem Danke.



  • du kannst in der Klasse A einen Instanz von Klasse B instanzieren ( nur .h file includen). Da die B klasse von A erbt, kann es auch deren Methoden verwenden, es sei den du verwendest Polymorphismus, in dem Fall musst du sie "overriden".



  • @Shuffel:

    Mir ist irgendwie überhaupt nicht klar was Du erreichen willst. Kannst Du das vielleicht mal anhand eines konkreteren Beispiels erklären?

    MfG Jester



  • Ich habe eine Klasse A die ich beim starten des Programms miz new anlege.Diese Klasse besteht bis zum Ende des Programmes.Diese Klasse A allociert weitere Klassen.Jetzt brauche ich eine neue Klasse die die gleichen Funktionen hat wie Klasse A.Nur die intere Verarbeitung läuft anders ab.
    Jetzt habe ich mir gedacht ich leite diese Klasse von A ab.Mein Problem aber ist das das zur Runtime erfolgen muss und ich die Instanz von A brauche.
    Kurz gesagt, ich muss eine abgeleitete Klasse erstellen die aber auf eine schon vorhandene Basisklasse basiert.
    Ich hoffe das das Problem jetzt klar wurde.
    Ist dieses überhaupt möglich ??????



  • ich glaube du verwechselst da begriffe (klasse/instanz).
    eine klasse kannst du zur laufzeit nur instanziieren (d.h. objekte erzeugen). klassen selbst definierst du nur während der entwicklung.
    vielleicht erklärst du das, was du willst, noch ein bisschen genauer und mit etwas pseudocode.



  • Jetzt kommt ein wenig Pseudocode 🙂

    class A : public B
    {
            blabla
    }
    
    class C : public A
    {
           blabla
    }
    
    // Beim starten vom Programm
    aa = new A;
    
    // Während der Laufzeit
    bb = new C;
    // Jetzt müsste ich einen Pointer bb haben der aber an die Instanz von aa hängt
    

    Ich hoffe das Problem wird langsam klarer.
    Ich könnte es auch anders lösen,aber diese Möglichkeit(falls es gehen sollte)wäre die einfachste.
    Es ist die Erweiterung von einem fertigen Projekt und alles andere würde sich quer durch das Programm ziehen.



  • //Beim starten vom Programm
    A aa = new A;

    // Während der Laufzeit
    C bb = new C;
    // Jetzt müsste ich einen Pointer bb haben der aber an die Instanz von aa hängt

    1. ich glaube das sollte laufen.

    2. mit dem new operator wird Speicher immer erst zur Laufzeit (und nicht etwa zu kompilierzeit, wie statische oder lokale ver) alloziert



  • Und genau da ist mein Problem.
    Wenn ich zur Laufzeit C bb = new C; mache habe ich eine neue Instanz.Diese Instanz soll sich aber auf die schon bestehende erste Instanz beziehen.
    Sozusagen als wenn ich beim starten des Programms sofort sage C bb = new C.
    Dann habe ich ja die Klasse C und die Klasse A am Wickel.Weil dies ja nicht der Fall ist suche ich eine Lösung um zur Laufzeit meinen Pointer auf c zu kriegen.



  • Ich muss dir leider sagen, das das was du vorhast nicht funktioniert. Du erzeugst zu Begin ein Objekt vom Typ 'class A'. Dieses Objekt bleibt bis zu seiner Zerstörung ein 'class A' und kann nicht auf einen anderen Typ "umgebogen" werden.



  • Vieleicht hab ich das Problem nicht richtig verstanden, aber wenn du willst das aa auf eine Instanz von C zeigt, was spricht dann gegen:

    A* aa = new A();
    
    ...
    
    delete aa;
    aa = new C();
    


  • Wenn ich delete aa mache zerstöre ich die bestehenden Instanzen von class A.
    Diese Instanzen dürfen aber zur Laufzeit nicht geschlossen werden.
    Ich muss langsam aber sicher einsehen das es nicht funktioniert was ich vorhabe. 😡
    Falls aber noch jemand eine Idee hat,noch ist es nicht zu spät. 😃 😃 😃

    Muss jetzt in den sauren Apfel beissen und die bisherige Klassenstruktur umbauen.



  • Also den Typ eines tatsächlichen Objektes zur Laufzeit zu verändern wirst du wohl eher nicht hin bekommen.

    Aber wenn du das alte Objekt behalten willst und aber auch ein neues haben willst kannst du vieleicht etwas machen wie:

    A* aa = new A();
    
    ...
    
    aa = new C(aa);
    

    Und du verwaltest das alte Objeckt in dem neuen. Dann werden die methoden von dem neuen aufgerufen, aber du kannst noch auf die eigenschaften des alten zugreifen.

    Gruß
    Martin



  • Das wäre eine Lösung.Warum bin ich nicht selber drauf gekommen.
    Tausendmal Danke


Log in to reply