wozu Destruktor explizit schreiben?



  • Ich muss für eine Klasse einen Destruktor erstellen, der den alloziierten Speicher wieder freigibt. Im Gegensatz zum Konstruktor, den man variabel gestalten kann, indem man etwa verschiedene Möglichkeiten bietet Parameter für ein Objekt zu übergeben, hat der Destruktor keine Parameter. Ein Standard-Destruktor reicht doch? Zu welchem Zweck hat man die Möglichkeit einen Destruktor explizit zu definieren?

    Was soll denn in den geschweiften Klammern stehen?

    Klassenname::~Klassenname(void){
    
    }
    


  • Wenn du einen Destruktor schreiben musst der Speicher wieder frei gibt, dann sollte zwischen den geschweiften Klammern wohl das Speicher freigeben stehen. 😃

    Meine Vermutung ist allerdings dass du gar keinen Destruktor definieren musst, das macht man eigentlich nur in Ausnahmefällen.



  • cooky451 schrieb:

    Meine Vermutung ist allerdings dass du gar keinen Destruktor definieren musst, das macht man eigentlich nur in Ausnahmefällen.

    Meienr Meinung nach hört sich der Op eher danach an als ob er durch einen Prof/Lehrer eine Klasse, die dynamisch Speicher alloziert, bekommen aht und diese vervollständigen muss. Und dass er dabei keinen Plan hat.

    @OP: Zeig mal Code



  • [quote="Skym0sh0"]

    cooky451 schrieb:

    @OP: Zeig mal Code

    class Bla{
    public:
    Bla(int rows, int cols);
    ~Bla();
    // weitere Methoden
    };
    

    "Implementieren Sie den Konstruktor Bla(int rows, int cols). Dieser soll den für ein Spielfeld mit rows Reihen und cols Spalten benötigten Speicher automatisch allozieren. Legen Sie die für den Zugriff auf das Spielfeld nötigen Variablen im private Bereich der Klasse an. Implementieren Sie außerdem den Destruktor ~Bla(), der den für das Spielfeld allozierten Speicher wieder frei gibt."

    PS. Die Klasse heißt nicht wirklich "Bla" 🙂



  • Implementieren Sie außerdem den Destruktor ~Bla(), der den für das Spielfeld allozierten Speicher wieder frei gibt.

    Wenn du einen Destruktor schreiben musst der Speicher wieder frei gibt, dann sollte zwischen den geschweiften Klammern wohl das Speicher freigeben stehen.



  • cooky451 schrieb:

    Wenn du einen Destruktor schreiben musst der Speicher wieder frei gibt, dann sollte zwischen den geschweiften Klammern wohl das Speicher freigeben stehen.

    Wie sieht das z.B. aus? Also wenn ich mit z.B.

    int xyz = new int;
    

    Speicher alloziere, lösche ich das wieder mit delete xyz; ?

    Aber welchen Zweck hat das überhaupt? Der Konstruktor soll doch den Eigenschaften/Attributen Initialwerte geben. Diese werden per Parametern übergeben. Was bringt dann Speicher für bereits existierende Variablen zu allozieren?



  • kollja21 schrieb:

    Aber welchen Zweck hat das überhaupt? Der Konstruktor soll doch den Eigenschaften/Attributen Initialwerte geben. Diese werden per Parametern übergeben. Was bringt dann Speicher für bereits existierende Variablen zu allozieren?

    Mit den parametern rows und cols bekommst du bloß angegeben, wie groß das von dir in der Klasse zu alloziierende Feld sein soll ... daraus wird nicht irgendwie magisch ein dementsprechend großer Speicherbereich für ... was auch immer.



  • Swordfish schrieb:

    Mit den parametern rows und cols bekommst du bloß angegeben, wie groß das von dir in der Klasse zu alloziierende Feld sein soll ... daraus wird nicht irgendwie magisch ein dementsprechend großer Speicherbereich für ... was auch immer.

    Aber die Speichergröße dieser Variablen wird doch im private-Bereich durch Deklaration von int cols und int rows festgelegt. Zumindest verstehe ich das so aus der Aufgabenstellung heraus.



  • Nochmal:

    Swordfish schrieb:

    Mit den parametern rows und cols bekommst du bloß angegeben, wie groß das von dir in der Klasse zu alloziierende Feld sein soll ... daraus wird nicht irgendwie magisch ein dementsprechend großer Speicherbereich für ... was auch immer.

    Was macht denn dein Konstruktor?



  • Swordfish schrieb:

    Nochmal:

    Swordfish schrieb:

    Mit den parametern rows und cols bekommst du bloß angegeben, wie groß das von dir in der Klasse zu alloziierende Feld sein soll ... daraus wird nicht irgendwie magisch ein dementsprechend großer Speicherbereich für ... was auch immer.

    Was macht denn dein Konstruktor?

    Also ich verstehe das Prinzip des Konstruktors so, dass er bereits existierenden Variablen Initial-Werte verteilt. In meiner Aufgabe werden ihm sogar welche per Parameter übergeben. Auch steht in meiner Aufgabe, dass ich diese Variablen im privat-Bereich anlegen soll. Also schreibe ich z.B.

    int rows;
    

    und damit wird Speicher alloziert. Oder nicht?

    Zu welchem Zweck muss ich dann im Konstruktor noch mal Speicher aloziieren?

    ____
    Bitte nicht schimpfen, ich bin noch ein Noob 🙂



  • kollja21 schrieb:

    [...]Also schreibe ich z.B.

    int rows;
    

    und damit wird Speicher alloziert. Oder nicht?

    Ja. Speicher für einen Integer, auf dem Stack.

    kollja21 schrieb:

    [...]Zu welchem Zweck muss ich dann im Konstruktor noch mal Speicher aloziieren?

    Für ein Spielfeld von rows x cols Feldern ...



  • Swordfish schrieb:

    kollja21 schrieb:

    [...]Also schreibe ich z.B.

    int rows;
    

    und damit wird Speicher alloziert. Oder nicht?

    Ja. Speicher für einen Integer, auf dem Stack.

    kollja21 schrieb:

    [...]Zu welchem Zweck muss ich dann im Konstruktor noch mal Speicher aloziieren?

    Für ein Spielfeld von rows x cols Feldern ...

    Achso, also eine Matrix, bzw. ein 2D-Array?



  • kollja21 schrieb:

    Achso, also eine Matrix, bzw. ein 2D-Array?

    Vermutlich. Aber DU sitzt doch in der Vorlesung?



  • Swordfish schrieb:

    kollja21 schrieb:

    Achso, also eine Matrix, bzw. ein 2D-Array?

    Vermutlich. Aber DU sitzt doch in der Vorlesung?

    Wie man das umsetzen soll, weiß ich ja. Ich habe die Formulierung nicht verstanden. Das ist eben das Blöde, wenn es für ein Wort 10 Synonyme gibt. Stände da "erstelle ein Array" oder "Matrix" hätte ich es gleich verstanden. Aber Feld oder noch besser Spielfeld..? interprätiert mal was die damit meinen.



  • Na dann? Stell dir einfach vor, da stünde "Matrix".



  • kollja21 schrieb:

    Stände da "erstelle ein Array" oder "Matrix" hätte ich es gleich verstanden. Aber Feld oder noch besser Spielfeld..? interprätiert mal was die damit meinen.

    Für ein Studium ist es Voraussetzung, dass man seinen Verstand benutzt.



  • Du erwartest von einem durchschnittlichem Studenten beinahe unmögliches.



  • @Swordfish
    Danke für die Hilfe



  • kollja21 schrieb:

    Swordfish schrieb:

    kollja21 schrieb:

    Achso, also eine Matrix, bzw. ein 2D-Array?

    Vermutlich. Aber DU sitzt doch in der Vorlesung?

    Wie man das umsetzen soll, weiß ich ja. Ich habe die Formulierung nicht verstanden. Das ist eben das Blöde, wenn es für ein Wort 10 Synonyme gibt. Stände da "erstelle ein Array" oder "Matrix" hätte ich es gleich verstanden. Aber Feld oder noch besser Spielfeld..? interprätiert mal was die damit meinen.

    Spielfeld ist die fachliche Anforderung. Darauf, dass ein Spielfeld technisch mit einem Array oder einer Matrix implementiert wird, sollte der Entwickler kommen. Das ist in der Regel so, dass die Anforderungen fachlich gestellt sind und damit natürlich fachliche Begriffe verwendet werden.

    Bist Du in der Schule oder in der Uni? In der Schule wird nach der Lösung einer Aufgabe mit Hilfe eines bestimmten Werkzeugs gefragt. In der Uni sollte hoffentlich das Werkzeug nicht angegeben werden sondern nur die Aufgabe. So ist das zumindest spätestens in der beruflichen Praxis.

    Ein Ingenieur bekommt ja keine Aufgabe: wähle eine geeignete Schraube indem Du die Belastung berechnest, sondern es ergibt sich die Aufgabe, 2 Teile miteinander zu verbinden. Er muss erkennen, dass eine Schraube das geeignete Mittel darstellt und muss wissen, dass er diese Schraube als nächstes dimensionieren muss.



  • tntnet schrieb:

    (...)Bist Du in der Schule oder in der Uni? In der Schule wird nach der Lösung einer Aufgabe mit Hilfe eines bestimmten Werkzeugs gefragt. In der Uni sollte hoffentlich das Werkzeug nicht angegeben werden sondern nur die Aufgabe. So ist das zumindest spätestens in der beruflichen Praxis.

    Ein Ingenieur bekommt ja keine Aufgabe: wähle eine geeignete Schraube indem Du die Belastung berechnest, sondern es ergibt sich die Aufgabe, 2 Teile miteinander zu verbinden. Er muss erkennen, dass eine Schraube das geeignete Mittel darstellt und muss wissen, dass er diese Schraube als nächstes dimensionieren muss.

    Um auf dein Beispiel einzugehen, meine Aufgabe lautet nicht "hier sind 2 Teile. Verbinde sie." sondern "hier sind 2 Teile, verbinde sie unter folgenden Bedingungen: ... ." Nun kann es einem Menschen passieren, ob er aus der Schule, Uni oder der Berufswelt kommt, dass er die sprachliche Formulierung nicht eindeutig versteht. Und weil ich kein C++ Guru bin, und mir nicht sicher bin was ich jetzt nicht verstanden habe, frage ich.



  • Es ergibt für mich leider immer noch keinen Sinn.
    Wenn ich im Konstruktor, der ja auch nur eine Funktion ist, eine Variable/Pointer, was auch immer, anlege, dann wird es doch nach dem Beenden der Funktion/Konstruktor, von selbst wieder gelöscht. Oder nicht?
    Also müsste ich bereits vor dem Kontruktor - im private-Bereich der Klasse - die Matrix anlegen. Dann macht aber die Allokation im Konstruktor wieder keinen Sinn.


Anmelden zum Antworten