Setter in C++
-
Hallo zusammen,
also ich möchte gerade ne Simulation schreiben und steh glaub ich gerade
aufm Schlauch. Wie krieg ich die Speicherverwaltung hin, wenn ich zum
Beispiel die Strategie in einer Spieler-Klasse setzen möchte.Wie mach ich das am Besten?
class Player { void setStrategy(Strategy s); // und brauch nen Korrekten Copy-Konstruktor // aber krieg ich doch nen Problem bei pure virtual, oder? // vielleicht ne zusätzliche clone-Methode? }oder
class Player { void setStrategy(std::auto_ptr<Strategy* s>); // Hier sehe ich kein Problem // bzw mit shared_pointer }Oder macht man das eigentlich anders?
Gruß,
*Cpp-Anfänger*
-
Wenn du auf Polymorphie hinauswillst: das funktioniert nur mit Zeigern (inklusive Smart-Pointern) oder Referenzen - in deinem Fall wohl eher Zeiger. Allerdings mußt du dir darüber klar werden, wem das Objekt gehört, auf das du intern verweist.
(entweder du nimmst für jeden Spieler eine eigene Kopie, dann benötigst du eine virtuelle clone()-Methode, oder du verwendest Shared-Pointer (auto_ptr würde ich nicht verwenden)
-
Danke CStoll...
CStoll schrieb:
Allerdings mußt du dir darüber klar werden, wem das Objekt gehört, auf das du intern verweist.
Nur genau da liegt mein Problem darin. Woher weiß ich, wenn ich jetzt ein
komplexeres Projekt habe, ob der Setter den ich verwende die Speicherverwaltung
übernimmt oder nicht. Deswegen dachte ich an einen auto_ptr, denn dann ist
es eindeutig, dass er die Veranwortung für das Objekt übernimmt.
Oder gibt es eine Coding Convention, so dass man das an der Signatur sieht?EDIT: Ich versuche mich immer an dem RAII-Konzept zu orientieren, nur hier
ist das leider nicht möglich
-
gibt ne sehr einfach konvention: "wer es erzeugt, muss auch hinterher aufräumen". ist eigentlich fast immer praktikabel. definiere einen punkt im ablauf, an dem das objekt sicher nicht mehr benötigt wird und räume an der stelle dann auf.
-
Mit C++ Syntax kannst du einen Besitz nicht direkt darstellen. Du kannst dir deine eigene Konvention setzen. auto_ptr ist eine sehr gute Möglichkeit dafür, denn der Leitspruch bei auto_ptr lautet "Es kann nur einen Besitzer geben!". Dein erstes Beispiel würde auch syntaktisch gut sein, dann würde durch den Stack das Resource-Management arbeiten. aber bei abstrakten Klassen klappt das natürlich nicht.
Pointer würde ich in dem Fall nicht benutzen, weil Pointer ja nur auf etwas verweisen. Und für mich heißt das, das Objekt liegt bei jemand anderem, aber ich kenne es halt nur durch den Pointer.