Vererbung, Klassen, verkettete stl::list von zeigern?



  • ich hab hier klassen eine Klasse Town geschrieben und eine abstracte Klasse Building die 4 weitere Klassen hat (die von Building erben)
    hier header von town und der building

    #pragma once
    #include <string>
    using std::string;
    using std::ostream;
    using std::endl;
    class Town
    {
    public:
    	Town(const string& townName);
    	Town(const Town& src);//copyconstructor wg kopieren in liste?!
    	virtual ~Town(void);
    	void setTownName();
    	string getTownName()	const;
    	int getTownSize()		const;
    	int getTownMoney()		const;
    	int getTownResearch()	const;
    	int getTownLuxuryGoods()const;
    	void grow();
    	bool operator<(const Town& value) const;
    	bool operator>(const Town& value) const
    	{
    		return value < *this;
    	}
    private:
    	string makeCompareable(const string& str) const;
    	string name;
    	int size;
    	int money;
    	int research;
    	int luxuryGoods;
    };//end class Town
    inline ostream& operator<<( ostream& out,  Town const &t ) 
    { 
    	out<<std::left<<"Stadt:\t\t"<<t.getTownName()
    		<<" \nhat groesse:\t"<<t.getTownSize()
    		<<" \nbesitzt:\t"<<t.getTownMoney()<<" Euro."
    		<<" \nund hat:\t"<<t.getTownLuxuryGoods()<<" Luxusgueter."
    		<<" \nund Wissen:\t"<<t.getTownResearch()<<" IQ."
    		<<"\n******************************"<<endl;
    	return out; 
    }
    

    -> klasse building
    #pragma once
    #include "Town.h"

    class Building
    {
    public:
    	Building()
                {"......... "   //<< im konstructor ..setzen s.u. Erklärung}
    ; 
    	virtual ~Building(void);
    	virtual void improveTown()=0;
    
    private:    //hier hab ich mal vermutet...
    	//Town &refTown; // scheint wohl die Referenz auf town oder ? 
    
    };
    

    Jetzt muss ich ein Attribut einfügen .. eine Referenz von Town, die vom Konstruktor dann auf diejenige Stadt(Town) gesetzt wird , zu der dann das jeweilige Gebäude gehört.. nur wie mach ich das hmm?
    (später leite ich von building die 4 Klassen ab bsp. Bank und so sachen...)
    so... desweiteren muss ich in der Townklasse eine verkettete Liste von Building* Zeigern als attribut einfügen ( 😕 😕 😕 nunja eine std:liste wollte ich da nehmen.. aber wie sieht das codemässig aus?)
    ich hoff die problemdarstellung ist klar und ihr könnt mir helfen 🙄



  • Hallo,

    Warum willst du in Town eine Liste von Building-Zeigern? Eine Liste auf Objekte tut es hier auch.
    Wenn eine Stadt alle seine Gebäude kontrolliert, muß das einzelne Gebäude doch auch nicht mehr wissen in welcher Stadt es ist.
    Wenn du es unbedingt brauchst speichere in Building einen Zeiger auf das Parent-Town-Objekt.

    class Building
    {
    public:
        Building(Town* parent) : refTown(parent) // Pointer auf die verwaltende Stadt
    {};
        virtual ~Building(void);
        virtual void improveTown()=0;
    
    private: 
        //Town* refTown;
    };
    


  • Braunstein schrieb:

    Hallo,

    Warum willst du in Town eine Liste von Building-Zeigern? Eine Liste auf Objekte tut es hier auch.
    Wenn eine Stadt alle seine Gebäude kontrolliert, muß das einzelne Gebäude doch auch nicht mehr wissen in welcher Stadt es ist.
    Wenn du es unbedingt brauchst speichere in Building einen Zeiger auf das Parent-Town-Objekt.
    };

    naja ganz einfach es ist nich nur eine stadt sondern es werden mehere Städte generiert und jede stadt besitzt gebäude.
    d.h. ich habe eine Liste von Städten in meiner main() und die Städte sollen als attribut eine Liste von Gebäuden haben .. und genau das ist mein problem.
    von daher brauch ich eine Liste von Building-Zeigern als attribut. damit ich ein Building Objekt dynamisch erzeugen kann und in die Building* liste der betreffenden Stadt einfügen kann. von daher nur wie sieht das aus eine verkettete liste von Building*-zeigern...
    also stimmte das schonmal..was ich im kommentar geschrieben hab //Town* refTown; ??



  • Ein Building kann doch eigentlich nur in einer Stadt sein.
    Du brauchst hier keine Liste von Building-Zeigern (Objekte reichen). Die Stadt muß die Liste der Gebäude verwalten (hinzufügen, löschen etc.).
    Was hindert dich denn daran hier

    std::list<Building> buildings;
    

    zu nehmen.
    Da könnte man so ein Gebäude hinzufügen

    buildings.push_back(Building(this)); // Wenn im Konstruktor der zeiger auf Town mitgegeben werden soll
    


  • sten schrieb:

    daher brauch ich eine Liste von Building-Zeigern als attribut. damit ich ein Building Objekt dynamisch erzeugen kann und in die Building* liste der betreffenden Stadt einfügen kann. von daher nur wie sieht das aus eine verkettete liste von Building*-zeigern...

    std::list<Building*> buildings;
    

    ?



  • Ja sicher. Nur warum?
    Bei Zeigern muß er halt immer Gültigkeit prüfen und selber für das Aufräumen sorgen.



  • Braunstein schrieb:

    Ja sicher. Nur warum?
    Bei Zeigern muß er halt immer Gültigkeit prüfen und selber für das Aufräumen sorgen.

    also bei meinem programm hab ich mehrere städte die Gebäude haben .. dabei kann das bsp. das Gebäude "bank" und "Uni" in Stadt "Mannheim" also auch in Stadt "Frankfurt" sein.. es sind die gleichen wenn auch nicht dieselben 😉
    d.h. es gibt sowohl eine Bank in Frankfurt alsauch eine "Bank" in Mannheim.
    Ich erzeuge ein Gebäudeobjekt und tu es in die Building*Liste der betreffenden Stadt. Ne stadt soll eben mehrere gebäude(Bank, Uni, Markt usw..) haben die ich in einer liste abspeichern und aufrufen muss. oh man iss sau kompliziert 😉 ..



  • Braunstein schrieb:

    Ja sicher. Nur warum?
    Bei Zeigern muß er halt immer Gültigkeit prüfen und selber für das Aufräumen sorgen.

    Weil Building abstrakt ist, zudem kann er ja auch smart Pointer benutzen.



  • KasF schrieb:

    Braunstein schrieb:

    Ja sicher. Nur warum?
    Bei Zeigern muß er halt immer Gültigkeit prüfen und selber für das Aufräumen sorgen.

    Weil Building abstrakt ist, zudem kann er ja auch smart Pointer benutzen.

    nee kann ich nicht 😉 k.a. *g



  • Stimmt, das mit dem abstrakt hatte ich irgendwie übersehen. Also Pointer. 🙂



  • bei beiden klassen muss ich noch vorwärts deklarieren oder?
    also

    class Building;
    Class Town
    {..
    }
    

    und umgekehrt in der anderen klasse auch



  • Ja, wenn du in Building den Pointer auf Town halten willst schon.


Anmelden zum Antworten