Array von Objekten einer Klasse - Doppelpointer



  • Hi Leute,

    ich habe folgende Aufgabe vor mir: Ich habe eine Basisklasse "Form" geschrieben, die eine einzige Methode, nämlich "virtual double flaeche();" enthaelt. Von dieser Klasse wurden 3 Klassen abgeleitet "Dreieck", "Rechteck" und "Kreis". Bei allen dreien wurde die virtuelle Flaechen-Funktion fuer den entsprechenden Fall angepasst und überschrieben.
    Nun ist die Aufgabe, in der main ein Array des Typs Form zu erzeugen, in dem sich verschiedene geometrische Objekte befinden (Dreiecke, Rechtecke, Kreise) und anschließend die Gesamtflaeche dieses Arrays auszugeben.
    Ich habe meine Flaechenfunktionen in der main bereits getestet, sie funktionieren für jede abgeleitete Klasse.
    Das Array wird wohl über folgende Zeile erzeugt:
    Form** Array;

    Ich verstehe nun leider nicht, wie ich dieses Array befülle, bzw wie ich generell damit umgehen soll. Kennt sich hier jemand aus und kann mir helfen?



  • Hallo,

    den schweren Teil hast du doch schon.
    Das Array kann nicht vom 'Typ Form' sein, sondern muss aus Zeigern auf Form bestehen. Also sowas:

    Form* dasArray[123];
    // An Position 99 soll ein Dreieck sein
    dasArray[99] = new Dreieck(...);
    // Zugriff ganz normal
    double d = dasArray[99]->flaeche();
    


  • Danke für die schnelle Antwort 🙂
    Hm, mir wurde in der Uni gesagt man bräuchte einen Doppelpointer 😕 Vll hätte ich erwähnen sollen, dass die Basisklasse, sowie jede abgeleitete Klasse eine eigene .cpp und eine eigene .h Datei besitzen. Das gewünschte Programm mit dem Array usw. steht allerdings komplett in der main()Funktion.
    Wenn ich das ganze jetzt mit einem normalen Pointer (wie in deinem Vorschlag) mache bringt er mir momentan immer einen Fehler bei dem Zugriff, sprich er findet garkeine Flaechenfunktion 😕



  • Also eigentlich brauchst du einen Vector 😉
    Den Doppel-Pointer brauchst du nur, wenn du den vector (warum auch immer) nicht nehmen darfst und ein Array dynamischer Länge brauchst.

    Sag mal den genauen Fehler.



  • Ah ich nehme alles zurück 😛 Habs hinbekommen mit dem normalen Vektor, danke! 🙂 Vermutlich wird das Programm noch dynamisch erweitert, sonst hätte man mir nicht diesen Lösungsvorschlag gegeben denke ich^^ Hast du eine vorstellung wie das dann aussehen würde?



  • Damit wir nicht aneinander vorbei reden: der 'normale vector' ist dieser:

    std::vector<Form*>
    

    Dynamisches Array wäre sowas:

    Form** dynArray = new Form*[2];
    

    Und die ganze Deleterei nicht vergessen.



  • Sehr nice, jetzt passts auch dynamisch 🙂 Vielen Dank für deine Hilfe 👍 Eine Kleinigkeit noch, bei dem delete Befehl schreibe ich egal ob doppelpointer oder einfacher "delete[] array;" oder? Ein Fehler zeigt er mir dabei zumindest nicht an 🙂



  • Nee, das ist halt alles Mist so mit dem dynamischen Array und das wird man euch hoffentlich auch noch irgendwann sagen.
    (So nach dem Motto erstmal den schlechten Weg lernen, um dann die Vorteile der Container-Klassen zu erkennen).

    Zu jedem new gehört ein delete (*). Hier also:

    size_t size = 5;
    // Speicher holen:
    Form** dynArray = new Form*[size];
    for(i=0; i<size;++i)
      dynArray[i] = new Irgendwas()
    // Speicher freigeben:
    for(i=0; i<size;++i)
      delete dynArray[i];
    delete[] dynArray;
    

    (*)Edit: und zu jedem new[] ein delete[]



  • Skyfall91 schrieb:

    Ein Fehler zeigt er mir dabei zumindest nicht an 🙂

    Und genau das ist die Gefahr dabei. Nur weil kein Fehler gemeldet wird, heisst das nicht, dass keiner existiert.

    Spätestens wenn dein programm länger läuft und/oder immer weiter viel Speicher anfordert (und eigentlich wieder freigeben soll) wird dir dieser Fehler zum Verhängnis.


Log in to reply