Konstruktor



  • @CStoll
    Ahhh..okey. Nur: Mein Compiler reklamiert bei vector<person*>(rooms_per_floor_)): "'vector': nichtdeklarierter Bezeichner".

    @HighLigerBiMBam
    Naja..ich hätte auch einiges anders gemacht. Aber übungshalber muss (sollte) ich es so lassen und so implementieren, wie es halt im header vorgegeben wurde.



  • So viel Mitdenken könnte man doch schon erwarten 😃
    ~versuch's mal mit "std::vector"~

    @BimBam: Man kann es mit der Abstraktion auch übertreiben. Wenn du nicht gerade eine Software für Architekten entwirfst, dürfte es ausreichen, die Raumaufteilung in der Gebäude-Klasse zu speichern.



  • Ahhh..sh...
    Okey, evtl. ist die späte Stunde schuld 😛
    (aber wenigstens hab' ich den Fehler beim Argument bemerkt 😉 )

    Eine Schlussfrage habe ich noch.
    Es gibt ja die Destruktor-Funktion.
    Dort muss ich doch den _assignments-vector löschen.
    Wie aber schreibe ich das korrekt?
    Mit "delete _assignments;" reklamiert mein Compiler...



  • Um den vector mußt du dich überhaupt nicht kümmern, das macht schon dessen Destruktor. Worüber du dir eventuell Gedanken machen solltest, sind die person-Objekte, die auf der untersten Ebene des Vektors gespeichert werden. Aber da ich nicht weiß, wer (und wie) die erzeugt und an die assign_room() übergibt, kann ich dazu nichts genaueres sagen.



  • Also erzeugt und zugewiesen werden sie in der main-Funktion einer anderen Klasse.
    Hier ein Code-Snippet:

    main(void)
    {
        person* first  = new person("Valentino", "Rossi", "via Bologna 84",1);
    
        building woko_first(1,2,4);
    
        woko_first.assign_room(first,2,4);
    
        /...
    }
    

    Allerdings gelingt es mir trotzdem nicht, die Person-Objekte zu deleten.



  • Einfachste Lösung: Wenn die main()-Funktion die Personen anlegt, sollte sie sie auch wieder löschen 😃

    Nächstbeste Lösung: Verwende einen vernünftigen Smart-Pointer anstelle der nackten Zeiger (z.B. shared_ptr)

    Wenn du dich unbedingt selber darum kümmern willst, mußt du mit einer doppelten Schleife durch den Vector durchlaufen und jedes einzelne Element per delete löschen.

    PS:

    MaxC++ schrieb:

    building woko_first(1,2,4);
    
        woko_first.assign_room(first,2,4);
    }
    

    Autsch - Die Indizes beginnen bei 0, d.h. der Raum 2/4 liegt außerhalb des vom Vector verwalteten Speicherbereiches.



  • Okey, angenommen, ich entscheide mich für die Schleifen-Methode.
    Wie bekomm ich da den Vektor mit den jeweiligen Elementen?
    Ich dachte, ich könne die Personen einfach per "person::person[1]" erreichen.

    Zu deiner Bemerkung:
    Schau Dir mal das Header-File aus einem vorherigen Post an. Das ist doch so gedacht, oder seh' ich das falsch?



  • Du erreichst die Person (bzw. den person*-Zeiger im Vector) in Raum y aus Etage x per _assignments[x-1][y-1] - zum Löschen mußt du alle Kombinationen von x und y durchlaufen.

    MaxC++ schrieb:

    Zu deiner Bemerkung:
    Schau Dir mal das Header-File aus einem vorherigen Post an. Das ist doch so gedacht, oder seh' ich das falsch?

    Stimmt auch wieder - da mußt du dann in allen Methoden die Koordinaten umrechnen.



  • Jeps, hab ich gemacht. (sehr mühsam..aber was solls)
    Dafür klappt nun alles. YES 🙂
    Vielen Dank für die Hilfe!



  • PS: Kann ich das so machen, oder funktioniert es nur "per Zufall"?
    Weil irgendwie hab ich mir das komplizierter vorgestellt.

    for(int x=1; x<_floors; x++)
    	{
    		for(int y=1; y<_rooms_per_floor; y++)
    		{
    			delete _assignments[x-1][y-1];
    		}
    	}
    


  • Genau so habe ich das gemeint - nur solltest du nochmal nachzählen, ob du mit der Schleife wirklich alle Einträge erwischst.



  • Eben..deshalb die PS-Frage 😉
    ..aber ich denke, dass ich so alle Einträge erreichen sollte, weil die Schleifen ja verschachtelt sind, und nicht nacheinander einzeln aufgerufen werden.
    Mit den Beispiel-Werten funktioniert's auf alle Fälle.



  • Leide nicht - Die Schleifen selber sind in Ordnung, die Abbruchbedingungen stimmen nicht ganz (du verfehlst das Dachgeschoß und den letzten Raum jeder Etage).



  • Also einfach wie folgt korrigieren?

    for(int x=1; x<_floors+1; x++)
        {
            for(int y=1; y<_rooms_per_floor+1; y++)
            {
                delete _assignments[x-1][y-1];
            }
        }
    


  • Warum nutzt du nicht einfach die size() Funktion des Vektors oder Iteratoren?



  • Braunstein schrieb:

    Warum nutzt du nicht einfach die size() Funktion des Vektors oder Iteratoren?

    Wäre zu einfach.


Anmelden zum Antworten