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,
    Cyrill

    Mein 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!!!


Anmelden zum Antworten