Fragen zur OOP...
-
Hi,
eine Frage ich wenn ich ein Objekt erstelle und ihm Informationen übergebe und es wieder zerstöre sollte es ja nicht mehr da sein. Aber ich wieder dem dem Zerstörten Objekt wieder Informationen übergebe ist das Objekt wieder da. Sollte es normalerweise nicht mehr gehen, oder wird automatisch das Objekt wieder erstellt? Oder wurde es nicht ganz zerstört, also gelöscht?
MfG,
CyrillMein Code:
Header:#pragma once #include <string> //using namespace std; class fahrzeug { private: int raeder; int gaenge; std::string typ; public: fahrzeug(); ~fahrzeug(); void set_info(int s_raeder, int s_gaenge, std::string s_typ); void info(); };Main:
#include <iostream> #include <string> #include "header.h" using namespace std; void main() { cout << "Programmstart..." << endl; fahrzeug car; car.info(); car.~fahrzeug(); car.info(); car.set_info(4, 6, "Auto"); car.info(); } fahrzeug::fahrzeug() { raeder = 0; gaenge = 0; typ = "not defined"; cout << "Fahrzeug wurde erstellt" << endl; } fahrzeug::~fahrzeug() { cout << "Fahrzeug wurde wieder zerstoert" << endl; } void fahrzeug::set_info(int s_raeder, int s_gaenge, string s_typ) { raeder = s_raeder; gaenge = s_gaenge; typ = s_typ; } void fahrzeug::info() { cout << "Informationen ueber das Fahrzeug : " << endl; cout << "Typ: " << typ << endl; cout << "Raeder : " << raeder << endl; cout << "Gaenge :" << gaenge << endl; }
-
erstmal: int main() anstatt void main()
man ruft den desturktor nicht explizit auf. Das wird automatisch gemacht, wenn das Objekt den Gültigkeitsbereich verlässt (Stack-Variablen) oder mittels delete gelösch werden (heap-variablen).
car wird in dem Beispiel nicht zerstört, weil es noch im gültigkeitsbereich ist. meiner meinung nach zerstört ~fahrzeug auch nicht das objekt sondern wird nur aufgerufen, damit das objekt allen speicher freigibt, den es anfordert. Zerstört wird es dann automatisch
-
danke für die antwort
Maxi schrieb:
erstmal: int main() anstatt void main()
Ich danke für die Tips. Ich hab void verwendet da unser prof auch grad void verwendet.
Ich arbeite mich gerade rein, daher bin ich für jede Hilfe sehr dankbar.
Ja ich hab gesehen das er immer beim Programmende den destruktor aufruft. Ich wollte nur wissen was der destruktor macht. Deswegen ein test den destruktor mitten rein zu bauen.
Vielen Dank.
-
Ein Objekt für das du den Destruktor explizit aufgerufen hast ist nicht mehr gültig und sollte auch nicht mehr verwendet werden.
Das es in deinem Fall trotzdem noch zu funktionieren scheint ist wohl eher ne Mischung aus Glück und den Eigenarten deines Compilers.Gruß Spacelord
-
Ich verwende Visual Studio 2005 Prof.

-
Hey!
Ich habe vor ein paar Tagen ein ähnliches Programm geschrieben, weil es in meinem Buch halt vorkam

// Liste2.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <iostream> #include <list> using namespace std; class CRaumschiff { public: CRaumschiff (int ID) //Konstruktor mit Wertübergabe { m_ID = ID; cout << "Raumschiff wurde erstellt" << endl; } ~CRaumschiff () //Destruktor { cout << "Raumschiff wurde zerstoert\n"; } void starten () //Funktion starten { cout << "Raumschiff " << m_ID << " gestartet." << endl; } //Variablendeklaration private: int m_ID; }; int main() { // Variablen list<CRaumschiff*> lSchiffe; list<CRaumschiff*>::iterator i; int Anzahl = 0; CRaumschiff *Temp = NULL; // Abfrage wie viele Raumschiffe gebaut werden sollen cout << " Anzahl: "; cin >> Anzahl; // Erstellen der Raumschiffe for (int j=0; j<Anzahl; j++) { Temp = new CRaumschiff (j+1); lSchiffe.push_back (Temp); } // Raumschiffe starten lassen for (i= lSchiffe.begin();i!=lSchiffe.end(); i++) { (*i)->starten(); } // Raumschiffe zerstören for (i=lSchiffe.begin(); i!=lSchiffe.end(); ++i) { delete (*i); (*i) = NULL; } //Liste löschen lSchiffe.clear(); system("PAUSE"); return 0; }Das ganze wurde mit verketteten Listen gemacht. Für jedes Raumschiff also ein seperates Objekt.
Sobald nun dieser code kommt// Raumschiffe zerstören for (i=lSchiffe.begin(); i!=lSchiffe.end(); ++i) { delete (*i); (*i) = NULL; }wird der Destruktor automatisch aufgerufen und der Zeiger (bzw Iterator) wird wirklich entfernt und damit dann halt auch das entsprechende Objekt (glaub ich zumindest xD). Es wird ja nirgendwo direkt ~CRaumschiff verwendet. Hoffe das kann dir nen bischen helfen, um Destruktoren zu verstehn.

Wie immer gilt: Wer Fehler findet, möge mich bitte darauf Aufmerksam machen, ich bin Anfänger!!!