Mehrmaliges Instanziieren führt zur Zerstörung ????
-
Bacid90210 schrieb:
Out of Scope .. das war mir klar .
Aber wiso hat unser Prof da sowas stehen wie wenn i > 0 --> Instanz wird zerstört
Mehr Kontext bitte, die Aussage macht so keinen Sinn.
-
Woher sollen wir das wissen?
Ich kenn keine KlasseStundent. Und ich kenn auch Deinen Prof nicht.
-
Also ...
Es geht um die Zerstörung von Objekten ..void main (int argc, char *argv[]) { string name="Axel Doering"; for (int i=0; i<10; i++){ // Erzeugen i+1. Instanz //(i>0 : Zerstören i. Instanz) Student bmt(name, i); bmt.printName (); } bmt.printName (); }Das hier ist die Klasse Student
class Student { //… float avgGrade; char* name; long matrikelNr; //… void printName (); }; void Student::printName() { cout << name << endl; }Mit folgendem Konstruktor
Student:: Student (char *sname, long smatrikel){ name = new char[strlen(sname)+1]; matrikelNr = smatrikel; strcpy (name, sname); }Und dem Destruktor der so aussieht ..
Student:: ~Student (){ delete [] name; }In seinem Script nimmt er an das beim mehrmaligen Instanziieren der gleichen Instanz ... das Objekt zerstört wird ..
-
Das hast du falsch verstanden. Schließlich steht da, dass die alte Instanz zerstört wird. Und dies geschieht übrigens nicht dadurch, dass eine neue Instanz angelegt wird, sondern dadurch, dass nach jedem Schleifendurchlauf der Scope der Schleife verlassen wird. Bei jedem Durchlauf ist alles was vorher war vergessen.
Ich mache mal eine kurze Demo und editiere die hier gleich rein.
Da:
#include <iostream> using namespace std; class foo{ private: int i; public: foo(int i):i(i) {cout<<"Objekt mit Parameter "<<i<<" erzeugt"<<endl;} ~foo() {cout<<"Objekt mit Parameter "<<i<<" zerstört"<<endl;} }; int main() { for(int i=0; i<10; ++i) { cout<<"Schleife hat gerade begonnen."<<endl; foo bar(i); cout<<"Schleife endet nach dieser Ausgabe."<<endl; } }
-
Bacid90210 schrieb:
In seinem Script nimmt er an das beim mehrmaligen Instanziieren der gleichen Instanz ... das Objekt zerstört wird ..
Lies mal vor.. glaub ich nicht, dass das da steht.
-
Er könnte eventuell gemeint haben, dass bei allen Schleifendurchläufen außer beim ersten das alte bmt-Objekt aus dem vorangegangenem Durchlauf zerstört wird.
Streng genommen wird es aber schon am Ende des jeweiligen Schleifendurchlaufs (auch des ersten) zerstört.
-
// Erzeugen i+1. Instanz
//(i>0 : Zerstören i. Instanz)Ok kann gut sein das ich das falsch verstanden habe ...
Aber
(i>0 . Zerstören der instanz )klingt verdächtig danach ..

-
So viele Antworten in so kurzer Zeit? Dann mache ich nochmal hier auf meine reineditierte Demo auf der vorhergehenden Seite aufmerksam.
-
Das ist irgendwie .. arg wirr.
Dein Konstruktor nimmt einen char* als namen (ein const char* wäre hier angebrachter), du übergibst aber in der Schleife einen std::string. Das geht nicht.
Und natürlich werden die Objekte, die in der Schleife angelegt werden, nach jedem Schleifendurchlauf wieder zerstört, beim nächsten Eintritt in den Schleifenrumpf wird wieder ein neues Objekt angelegt, welches am Ende wieder zerstört wird, usw. Aber die Aussage "bei i > 0 wird das i. Objekt zerstört" ist irgendwo krampf. Es gibt kein ites Objekt, sondern immer nur eines. Und klar, wenn ich nie in den Schleifenkörper reinkomm, wird auch nie ein Objekt angelegt, und damit auch nie eines zerstört.
Sehr mysteriöser Kurs... Wo findet der statt?
-
Vieleicht verstehe ich auch irgendwas falsch an seinen Ausführungen ...
Ich schreib ihm mal eine Mail ..Halte euch auf dem laufenden...
-
Niemand der auf void main hinweist? Bemerkenswert.
-
Bacid90210 schrieb:
Vieleicht verstehe ich auch irgendwas falsch an seinen Ausführungen ...
Ich schreib ihm mal eine Mail ..Halte euch auf dem laufenden...
Ich kann dir erklären wie das gemeint ist. Da steht: "Erzeugen i+1. Instanz. (i>0 : Zerstören i. Instanz)."
- Bei i=0 wird das i+1 = 1te Objekt angelegt. Es wird kein Objekt zerstört, weil noch keins da war.
- Bei i=1 wird das i+1 = 2te Objekt angelegt. Es wird vorher das i = 1te Objekt aus dem vorherigen Durchlauf zerstört.
- Dies wiederholt sich für alle folgenden Durchläufe.Es wird also in allen Fällen wo i>0 ist das vorhergehende Objekt zerstört, nur für i=0 nicht, weil noch keines da war.
-
Alle Variablen sind nur innerhalb ihres Namensraumes verfuegbar. Mittels { } legst du einen unbenannten Namensraum an. Wird er verlassen, so werden alle lokal in diesem Namensraum erstellen Variablen abgebaut. bmt ist solch ein Objekt. Die Schleife sorgt nur dafuer, dass der Bereich immer wieder betreten wird. Lass die Zeile mit for weg und du siehst es vielleicht deutlicher. Dort wird einmalig bmt angelegt und am Ende einmalig abgebaut.
-
SeppJ schrieb:
Bacid90210 schrieb:
Vieleicht verstehe ich auch irgendwas falsch an seinen Ausführungen ...
Ich schreib ihm mal eine Mail ..Halte euch auf dem laufenden...
Ich kann dir erklären wie das gemeint ist. Da steht: "Erzeugen i+1. Instanz. (i>0 : Zerstören i. Instanz)."
- Bei i=0 wird das i+1 = 1te Objekt angelegt. Es wird kein Objekt zerstört, weil noch keins da war.
- Bei i=1 wird das i+1 = 2te Objekt angelegt. Es wird vorher das i = 1te Objekt aus dem vorherigen Durchlauf zerstört.
- Dies wiederholt sich für alle folgenden Durchläufe.Es wird also in allen Fällen wo i>0 ist das vorhergehende Objekt zerstört, nur für i=0 nicht, weil noch keines da war.
Das ist allerdings missverständlich. Erstens ist es trivial, dass keine Zerstörung stattfindet, wenn kein Objekt existiert. Zweitens indiziert die Platzierung des Kommentars, dass die Zerstörung des vorigen Objektes dort stattfindet und gerade deshalb, weil ein neues Objekt erstellt werden soll. Nimmt man das an, macht der auf die Schleife folgende Ausdruck auch geringfügig Sinn.
Es trifft aber beides nicht zu.
Es wird in jedem Schleifendurchlauf, also auch bei i=0, das jeweilige bmt beim Verlassen des Blocks zerstört.
-
void main (int argc, char *argv[]) { string name="Axel Doering"; for (int i=0; i<10; i++){ Student bmt(name, i); bmt.printName (); } bmt.printName (); // <-- Compilerfehler }Nukularfüsiker schrieb:
Kompiliert der Code bei dir? Welchen Compiler benutzt du?
Wieso 'diskutiert' ihr hier so lange?
Mehr Kommentar als dem von Nukularfüsiker bedarf es hier ja wohl nicht...
-
CSpille schrieb:
Wieso 'diskutiert' ihr hier so lange?
Mehr Kommentar als dem von Nukularfüsiker bedarf es hier ja wohl nicht...Weil es hier absolut nicht um eventuelle Fehler im Programm geht. Lies doch mal die Frage des Threaderstellers.