new Objekt() - wie deleten??



  • Hallo,
    ich habe folgendes Problem. In dem kleinen Spiel soll es die Möglichkeit geben immer wieder eine neue Waffe (2 verschiedene Typen) zu kaufen. Da ich nicht weiß, wie viele gekauft werden, wollte ich immer wieder eine neue erstellen. Aber da diese mit new erzeugt werden, müssen sie auch irgendwie wieder gelöscht werden. Aber wie und wo lösche ich diese am besten?

    this->spieler.setWaffe(new Waffe1());

    this->spieler.setWaffe(new Waffe2());



  • 1. Verwende kein new, wenn du es nicht musst. Kannst du nicht einfach die Waffe ohne new anlegen, warum hast du dich für new entschieden?

    2. Falls du wirklich dynamisch allokieren musst dann nimm einen std::unique_ptr<Waffe>



  • Oops, Polymorphie, sorry.

    Mach folgendes:

    spieler->setWaffe(std::make_unique<Waffe1>());
    


  • Ich habe new ausprobiert, weil ich sonst keinen anderen Weg gesehen habe. Es muss ja immer wieder ein neues Objekt von Waffe erstellt werden, nicht dass es zB zwei Waffen gibt, die den selben Speicherbereich teilen.
    Deine zweite Option gucke ich mir näher an.
    Danke



  • julja schrieb:

    [...] Es muss ja immer wieder ein neues Objekt von Waffe erstellt werden, nicht dass es zB zwei Waffen gibt, die den selben Speicherbereich teilen.

    Du hast doch eh schon einen std::vector< waffe > in deinem spieler !?

    Ethon_ schrieb:

    Oops, Polymorphie

    Ruvi schrieb:

    Haben denn deine Waffen komplett unterschiedliche Funktionen?



  • Beide Waffen lassen sich von derselben Klasse ableiten. Die Unterklassen-Waffen überschreiben manche Funktionen der Oberklasse. Die Vererbung muss hierbei genutzt werden.



  • Du hast doch eh schon einen std::vector< waffe > in deinem spieler !?

    Es gibt allerdings einen "Shop", in dem man weitere Waffen zukaufen kann.



  • julja schrieb:

    this->spieler.setWaffe(new Waffe1());

    this->spieler.setWaffe(new Waffe2());

    Hat spieler jetzt eine Waffe (Waffe2) oder zwei Waffen (Waffe1 und Waffe2)?

    und wenn ich noch drei Mal setWaffe aufrufe, hat er dann fünf Waffen?

    Falls ja, ist das wohl nicht die richtige Stelle zum Löschen. Falls er jedoch immer nur eine Waffe hat, muss in setWaffe zuerst delete auf die bereits vorhandene aufgerufen werden.



  • Spieler kann mehrere Waffen tragen. Ein Spieler kann zB. nur maximal 10 ein anderer 20.



  • Wie sollen wir dann die Frage beantworten?

    julja schrieb:

    Aber wie und wo lösche ich diese am besten?

    Wie: mit delete
    Wo: da, wo Du feststellst, dass Du eine/mehrere Waffe(n) nicht mehr benötigst.



  • Was hast du denn jetzt überhaupt für einen Waffenvektor: einen vector<unique_ptr<Waffe>> wie im anderen Thread von mir empfohlen? Oder einen vector<Waffe*>, wo ich kommentiert hatte "wenn die Ownerfrage anderso behandelt wird". Offenbar wird die Ownerfrage aber bei dir nirgends behandelt... Also: was genau hast du jetzt gemacht?

    Die Antwort auf deine Ursprungsfrage ist also "nutze make_unique statt new". Solltest du nur C++11 statt C++14 benutzen können, findest du unter https://herbsutter.com/gotw/_102/ (Antwort zu Frage 4) eine mögliche Implementierung für make_unique in C++11.

    Ich finde es mit unique_ptr praktischer als irgendwo ein delete einzubauen. Da kann man leicht was vergessen.


Log in to reply