Viruelle Funktionen Speicherzuweisung



  • HIho!

    Also ich versuch mir ein paa Fähigkeiten in C++ anzueignen!
    Ich bin jetzt zu den virtuellen Funktionen vorgedrungen, doch da stoß ich auf ein Problem!
    Mein code:

    #include <iostream.h>
    #include <stdio.h>
    
    class Haus
    {
    protected:
    	int Flaeche;
    	char Adresse[100];
    public:
    	Haus (void);
    	void Initialisiere (int Fl, char *Adr);
    	virtual void Zeige (void);
    };
    
    class Wohnstube : public Haus
    {
    	char Gegenstand[20];
    public:
    	void Initialisiere (int Fl, char *Geg);
    	void Zeige (void);
    };
    
    class Kueche : public Haus
    { 
    	char Gegenstand[20];
    public:
    	void Initialisiere (int Fl, char *Geg);
    	void Zeige (void);
    };
    
    Haus::Haus(void)
    {
    	Flaeche = 300;
    	strcpy(Adresse,"Kirchstrasse 50");
    };
    void Haus::Initialisiere (int Fl, char *Adr)
    {
    	Flaeche = Fl;
    	strcpy(Adresse,Adr);
    }
    void Haus::Zeige (void)
    {
    	cout << "Die Wohnung ist " << Flaeche << " Quadratmeter gross und steht in der " << Adresse << "." << endl;
    };
    //-------------------------------------
    void Wohnstube::Initialisiere (int Fl, char *Geg)
    {
    	Flaeche = Fl;
    	strcpy(Gegenstand,Geg);
    };
    void Wohnstube::Zeige (void)
    { 
    	cout << "Im Wohnzimmer steht ein: "<< Gegenstand << " und es ist " << Flaeche << " Quardratmeter gross." << endl;
    };
    //-------------------------------------
    void Kueche::Initialisiere (int Fl, char *Geg)
    {
    	Flaeche = Fl;
    	strcpy(Gegenstand,Geg);
    };
    void Kueche::Zeige (void)
    { 
    	cout << "In der Kueche steht ein: "<< Gegenstand << " und sie ist " << Flaeche << " Quardratmeter gross." << endl;
    };
    
    Haus *Zimmer[5];
    
    int main ()
    {
    
    	Wohnstube *WohnstubeZeiger;
    	WohnstubeZeiger = new Wohnstube;
    	WohnstubeZeiger->Initialisiere(200,"Fernseher");
    	Zimmer[1] = WohnstubeZeiger;
    
    	Kueche *KuecheZeiger;
    	KuecheZeiger = new Kueche;
    	KuecheZeiger->Initialisiere(100,"Backofen");
    	Zimmer[2] = KuecheZeiger;
    
    	for (int i = 0; i < 5; i++)
    	{
    		Zimmer[i]->Zeige();
    	};
    	return 0;
    };
    

    ^^ warscheinl. schrecklicher Programmierstil, aber das soll euch erstmal ncith stören 😃
    DAs Problem ist, dass für die Zimmerzeiger kein Speicherplatz mit "new" bereitgestellt wird und mein programm deshalb abstürzt

    wenn ich aber so Speicherplatz bereitstellen würde:

    //...
    for (int i = 0; i < 5; i++)
    	{
                Zimmer[i] = new Haus;
    		Zimmer[i]->Zeige();
    	};
    //...
    

    oder so:

    //...
    for (int i = 0; i < 5; i++)
    	{
                Zimmer[i] = new Wohnstube;
    		Zimmer[i]->Zeige();
    	};
    //...
    

    dann hab ich den Effekt der virtuellen Funktionen ncihtmehr!

    Also irgendwo hab ich einen Fehler gemacht, denn hier:
    file://localhost/C:/Dokumente%20und%20Einstellungen/Udo/Eigene%20Dateien/Programmieren/C++/cpp_dodrill_einfuehrung/cpphtml/kapitel11.html (die ersten 5 Beispielcodes)
    funktioniert es aber ...

    DANKESCHÖN!



  • Der Link funktioniert nicht 😉



  • ubs, lol, sorry, ich bin beklopt, kann garnicht funzen *sich die Hand vor den Kopf schlag*

    Könnt ihr denn das Problem auch so finden, ansonsten würde ich halt den anderen Code, der aber nciths mit meinem zutun hat hier rein stellen, aber eigentl. müsste es auch ohne gehen!

    SORRY



  • Du belegst von den 5 nur zwei Zeiger und wunderst dich dann, warum du sie nicht ausgeben kannst? Gib halt nur die zwei aus, die auch belegt sind.



  • Top-se schrieb:

    Haus *Zimmer[5];
    
    int main ()
    {
    	
    	Wohnstube *WohnstubeZeiger;
    	WohnstubeZeiger = new Wohnstube;
    	WohnstubeZeiger->Initialisiere(200,"Fernseher");
    	Zimmer[1] = WohnstubeZeiger;
    	
    	Kueche *KuecheZeiger;
    	KuecheZeiger = new Kueche;
    	KuecheZeiger->Initialisiere(100,"Backofen");
    	Zimmer[2] = KuecheZeiger;
    	
    	for (int i = 0; i < 5; i++)
    	{
    		Zimmer[i]->Zeige();
    	};
    	return 0;
    };
    

    Ohne jetzt weiter auf andere Themen einzugehen: Du weist die zwei Zimmer in Deinem Zeiger-Array Platz 1 und 2 zu, aber es beginnt bei 0. Du gibst auch ab 0 aus, weswegen schon der erste Zeige-Zugriff auf die Nase fällt.

    (Ob es schlau ist, Zimmer von Haus abzuleiten, oder anderes, lasse ich jetzt mal beseite)



  • naja, aber so funzt es genausowenig:

    #include <iostream.h>
    #include <stdio.h>
    
    class Haus
    {
    protected:
    	int Flaeche;
    	char Adresse[100];
    public:
    	Haus (void);
    	void Initialisiere (int Fl, char *Adr);
    	virtual void Zeige (void);
    };
    
    class Wohnstube : public Haus
    {
    	char Gegenstand[20];
    public:
    	void Initialisiere (int Fl, char *Geg);
    	void Zeige (void);
    };
    
    class Kueche : public Haus
    { 
    	char Gegenstand[20];
    public:
    	void Initialisiere (int Fl, char *Geg);
    	void Zeige (void);
    };
    
    Haus::Haus(void)
    {
    	Flaeche = 300;
    	strcpy(Adresse,"Kirchstrasse 50");
    };
    void Haus::Initialisiere (int Fl, char *Adr)
    {
    	Flaeche = Fl;
    	strcpy(Adresse,Adr);
    }
    void Haus::Zeige (void)
    {
    	cout << "Die Wohnung ist " << Flaeche << " Quadratmeter gross und steht in der " << Adresse << "." << endl;
    };
    //-------------------------------------
    void Wohnstube::Initialisiere (int Fl, char *Geg)
    {
    	Flaeche = Fl;
    	strcpy(Gegenstand,Geg);
    };
    void Wohnstube::Zeige (void)
    { 
    	cout << "Im Wohnzimmer steht ein: "<< Gegenstand << " und es ist " << Flaeche << " Quardratmeter gross." << endl;
    };
    //-------------------------------------
    void Kueche::Initialisiere (int Fl, char *Geg)
    {
    	Flaeche = Fl;
    	strcpy(Gegenstand,Geg);
    };
    void Kueche::Zeige (void)
    { 
    	cout << "In der Kueche steht ein: "<< Gegenstand << " und sie ist " << Flaeche << " Quardratmeter gross." << endl;
    };
    
    Haus *Zimmer[2];
    
    int main ()
    {
    
    	Wohnstube *WohnstubeZeiger;
    	WohnstubeZeiger = new Wohnstube;
    	WohnstubeZeiger->Initialisiere(200,"Fernseher");
    	Zimmer[0] = WohnstubeZeiger;
    
    	Kueche *KuecheZeiger;
    	KuecheZeiger = new Kueche;
    	KuecheZeiger->Initialisiere(100,"Backofen");
    	Zimmer[1] = KuecheZeiger;
    
    	for (int i = 0; i < 2; i++)
    	{
    		Zimmer[i]->Zeige();
    	};
    	return 0;
    };
    

    oder hab ich jetzt irgendwo nen Denkfehler?



  • Ich nehm alles zurück, so funzt es!

    Dankeschön, ich muss also noch einiges lernen, sorry für die Belästigung, aber auf so nen banalen Fehler komm ich halt nciht ...

    THX



  • Eine Vererbung spiegelt idealweise eine "ist-ein"-Bezeihiehung wieder.

    Ist eine Küche ein Haus? - Ich denke mal nicht!

    Gruß



  • hm, nö 😃 , aber eine Küche ist in einem Haus *g*

    DAs programme hab ich nur mal schnell erfunden bzw. die Begebenheiten um virtuelle Funktionene zu testen, ich werde das Progie warscheinl. nie wieder nutzen, also hab ich mir dadrüber auch keine Gedanken gemacht, aber trotzdem THX für den Hinweis!



  • Top_se schrieb:

    hm, nö 😃 , aber eine Küche ist in einem Haus *g*

    Quasi ein Haus "hat eine" Küche..



  • Ich dachte immer, ein Haus hat mehrere Zimmer (std::vector<Zimmer*>). Ein Zimmer kann en Küche sein oder ne Wohnstube oder was ganz anderes.
    geloescht


Anmelden zum Antworten