wozu Destruktor explizit schreiben?



  • 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.



  • Ja, aber wenn du im Konstruktor new schreibst, musst du im Destruktor delete schreiben.



  • @Nathan: Er redet von lokalen Variablen im ctor ... hat Membervariabled noch ned durchschaut. Aber dazu mag ich jetzt vom phone nix tippen ...



  • Swordfish schrieb:

    @Nathan: Er redet von lokalen Variablen im ctor ... hat Membervariabled noch ned durchschaut. Aber dazu mag ich jetzt vom phone nix tippen ...

    Ok. In dem Fall:
    Ja, dann musst du die Variable im privaten Bereich anlegen. Aber du weißt du nicht wie groß der Speicher sein wird, sagst du? Ja, das weißt du nicht. Also kannst du lediglich einen Pointer anlegen*. Im Konstruktor weißt du wie groß der Speicher sein wird, also forderst du Speicher der entsprechenden Größe an. In diesem Fall musst du den dann auch im Destruktor löschen.

    *Bessere Variante wäre ein passender Container, der kümmert sich um Allokation und Deallokation automatisch.



  • Nathan schrieb:

    Ja, aber wenn du im Konstruktor new schreibst, musst du im Destruktor delete schreiben.

    Meine Frage ist, wozu man überhaupt im Konstruktor(einer Funktion) mit new oder ohne etwas erzeugen sollte, wenn man es außerhalb des Konstruktors nutzen möchte, wenn man doch keinen Zugriff darauf hat? Oder irre ich mich?



  • kollja21 schrieb:

    Nathan schrieb:

    Ja, aber wenn du im Konstruktor new schreibst, musst du im Destruktor delete schreiben.

    Meine Frage ist, wozu man überhaupt im Konstruktor(einer Funktion) mit new oder ohne etwas erzeugen sollte, wenn man es außerhalb des Konstruktors nutzen möchte, wenn man doch keinen Zugriff darauf hat? Oder irre ich mich?

    Siehe meinen neuesten Post.



  • @kollja21:
    Du hast wirklich keinen Schimmer, aber davon ganz schön viel! Wie hast du bloß die Schule geschafft?



  • Nathan schrieb:

    dann musst du die Variable im privaten Bereich anlegen. Aber du weißt du nicht wie groß der Speicher sein wird, sagst du? Ja, das weißt du nicht. Also kannst du lediglich einen Pointer anlegen*. Im Konstruktor weißt du wie groß der Speicher sein wird, also forderst du Speicher der entsprechenden Größe an. In diesem Fall musst du den dann auch im Destruktor löschen.

    ok, das macht Sinn. Meine Variable ist eine Matrix. Kannst du mir kurz hinschreiben, wie ein Pointer auf eine 2D-Matrix unbestimmter Größe aussieht? bitte 🙂



  • kollja21 schrieb:

    ...Kannst du mir kurz hinschreiben, wie ein Pointer auf eine 2D-Matrix unbestimmter Größe aussieht? bitte 🙂

    Wieso unbestimmter Größe?
    ...(int rows, int cols) => Größe ist vorgegeben.

    Beispielsweise:
    int * matrix = new int[rows*cols];


Anmelden zum Antworten