Zeiger einer Oberklasse auf eine Unterklasse zeigen lassen, ohne Attribute zu löschen



  • Hallo.

    Also, ich hab einen Zeiger des Types einer Oberklasse. Nun will ich ihn auf eine Unterklasse zeigen lassen, ohne die vorherigen Attribute zu löschen.

    MyClassA* point = new MyClassA();
    
    point = new MyClassB(); // Dies wird ja logischerweise die vorherigen Elemente löschen.
    

    Natürlich könnte ich alle Attribute einzelnt übertragen, aber da es nicht gerade wenig sind...

    Danke! 🙂



  • coder++ schrieb:

    point = new MyClassB(); // Dies wird ja logischerweise die vorherigen Elemente löschen.
    

    Ähm nein? Du zeigst einfach mit deinen Zeiger auf ein neues Objekt.



  • Ja so meinte ich das ja.
    Aber wenn ich keinen Zugriff mehr auf den Speicher hab, ist der Speicher ja nur noch unnötig im Arbeitsspeicher und ist subjektiv betrachtet "gelöscht".



  • Sind die Pointer in einem Container? Warum erstellst du nicht einfach neue Zeiger für die neuen Klassen?



  • coder++ schrieb:

    Ja so meinte ich das ja.
    Aber wenn ich keinen Zugriff mehr auf den Speicher hab, ist der Speicher ja nur noch unnötig im Arbeitsspeicher und ist subjektiv betrachtet "gelöscht".

    oh nein, das ist wichtig, dass der Speicher noch da ist, nur keiner mehr Zugriff darauf hat! -> Dein Program leakt.

    entweder löscht du die Klasse vorher mit delete und du kopierst dir den Zeiger.
    Oder noch besser: lass das mit besitzenden rohzeigern und nimm einfach ein unique_ptr / shared_ptr.



  • memoryLeakxXX schrieb:

    Sind die Pointer in einem Container? Warum erstellst du nicht einfach neue Zeiger für die neuen Klassen?

    Ich will später mit einem dynamic_cast auf die Unterklasse zugreifen.
    Ist nur ein einziger Zeiger(pro Objekt).



  • coder++ schrieb:

    Ja so meinte ich das ja.
    Aber wenn ich keinen Zugriff mehr auf den Speicher hab, ist der Speicher ja nur noch unnötig im Arbeitsspeicher und ist subjektiv betrachtet "gelöscht".

    Objektiv betrachtet ist er allerdings ein Speicherleck. Speicherlecks sind Fehler, die du die so schnell wie möglich abgewöhnen solltest.



  • coder++ schrieb:

    Aber wenn ich keinen Zugriff mehr auf den Speicher hab, ist der Speicher ja nur noch unnötig im Arbeitsspeicher und ist subjektiv betrachtet "gelöscht".

    Nein, er ist ganz und gar nicht gelöscht!
    Er ist im Arbeitsspeicher immer noch belegt und wird auch belegt bleiben, so lange dein Programm läuft. Du hast dann keine Möglichkeit mehr ihn zu löschen.

    Simpelste Regel: Vermeide rohe Pointer, die Speicher besitzen. Nutze unique_ptr, denen der Speicher gehört, dann kannst du auch einfach deinen Pointer auf ein anderes Objekt zeigen lassen, das alte steckt ja immer noch im unique_ptr.



  • coder++ schrieb:

    memoryLeakxXX schrieb:

    Sind die Pointer in einem Container? Warum erstellst du nicht einfach neue Zeiger für die neuen Klassen?

    Ich will später mit einem dynamic_cast auf die Unterklasse zugreifen.

    Das klingt auch nicht gut.
    Downcasts sind selten eine gute Idee.



  • Mir ist schon klar, dass der Speicher noch existiert. Keine Sorge 😃



  • Nathan schrieb:

    coder++ schrieb:

    memoryLeakxXX schrieb:

    Sind die Pointer in einem Container? Warum erstellst du nicht einfach neue Zeiger für die neuen Klassen?

    Ich will später mit einem dynamic_cast auf die Unterklasse zugreifen.

    Das klingt auch nicht gut.
    Downcasts sind selten eine gute Idee.

    Ich weiß.
    Geht aber leider nicht anders.



  • Erklär doch mal bitte, was du genau (und warum) machen möchtest. Attribute löschen und Attribute übetragen erlauben so viele Interpretationen zu, dass man dir damit kaum helfen kann.



  • Nunja.
    Der Zeiger soll auf ein Objekt der Unterklasse zeigen und gleichzeitig auf ein Objekt der Oberklasse.
    Ich dachte, man könnte vielleicht einen neuen Speicher aus der kombinierten Größe der beiden Objekte erstellen und den Zeiger darauf zeigen lassen. Klingt jetzt vielleicht naiv, aber ich hatte einfach keinen anderen Ansatz.



  • Du erklärst immer noch das "wie" und nicht was du eigentlich machen willst.



  • Ich wollte eine Renderfunktion schreiben und sie als Callback in einer Engine für ein bestimmtes Objekt anlegen.
    In dem Callback krieg ich aber als Parameter nur das Objekt. Also habe ich eine Unterklasse des Objektes gemacht, um dieser neue Attribute hinzuzufügen, welche ich benötigte.

    Aber das hat sich sowieso geklärt.
    Der Entwickler der Engine hat mir einen viel einfacheren Weg gezeigt.

    Danke trotzdem.


Log in to reply