Go Down

Topic: Array in Konstruktor deklarieren? (Read 80 times) previous topic - next topic

gsezz

Nov 03, 2014, 08:46 am Last Edit: Nov 03, 2014, 09:40 am by gsezz
Hallo,

Ich schreibe gerade an einer kleinen lib die LED Streifen steuern soll. Es gibt die Klasse c_Led, und c_Ledbar. c_Ledbar soll ein privates Array von c_Led Objekten enthalten, ein Objekt pro verbaute LED.
Nun muss ich bei der Definition des Arrays ja dessen Größe angeben, diese wir der Klasse aber erst beim Aufruf des Konstruktors übergeben. Wie kann man dieses Problem denn lösen? Das Array erst im Konstruktor deklarieren funktioniert ja nicht, bzw dann existiert es ja nur im Konstruktor.

Eine Lösung wäre natürlich auch das Array einfach in Übergröße zu definieren. Aber Speicher zu reservieren den man niemals braucht wird sicher nichts mit der Musterlösung zu tun haben.


pylon

Definiere das Array als Pointer und alloziere den Speicher dann im Konstruktor.

gsezz

Ah, danke. Allokieren war das Stichwort das ich gebraucht habe. Ich wusste dass das irgendwie geht, hatte mal über dynamische Speicherverwaltung gelesen, aber weniger als die Hälfte verstanden und einen großen Bogen darum gemacht.

Das sollte dann in etwa so aussehen?
Code: [Select]

class c_Led{
  private:
    uint8_t r,g,b;
  public:
    c_Led(){};
};

class c_LedBar {
  private:
    c_Led *ledArray;
  public:
    c_LedBar(uint8_t Anzahl) {
      ledArray = new c_Led[Anzahl];
    };
}; 

c_LedBar testBar(10);

void setup() {

}

void loop() {

}


Muss ich mich darum kümmern dass der Speicher wieder freigegeben wird? Die Objekte werden ja zur Laufzeit nicht mehr geändert.

pylon

Quote
Muss ich mich darum kümmern dass der Speicher wieder freigegeben wird? Die Objekte werden ja zur Laufzeit nicht mehr geändert.
Wenn Du's sauber machen willst, ja. Wenn Du Dich auf das beschränkst, was Du gepostet hast (statisch ein Objekt anlegen), dann ist es nicht zwingend, denn die Freigabe würde ja gar nie aufgerufen.

Go Up