Statische Array von Zeigern außerhalb der Klasse initialisieren
-
Ich hab ein Array von Zeigern in einer Klasse definiert:
class test { private: static int *zrg_arr[10]; ... };Wie kann ich diese nun außerhalb der Klasse initialisieren, damit ich sie verwenden kann?
Praktisch irgendwas wie:
int test :: zrg_arr[0] = NULL;
-
Wahrscheinlich so:
class test { private: static int *zrg_arr[10]; //... };int *test::zrg_arr[10] = {0,0,0,0,0,0,0,0,0,0};Felix
-
Geht das auch eleganter wenn es das Array z.B. einen größeren Index hat oder eine Konstante als Größe eingesetzt wird?
-
memset(zrg_arr, 0, 10*sizeof(int));füllt das Array mit 0-Bytes
-
crashterpiece schrieb:
memset(zrg_arr, 0, 10*sizeof(int));füllt das Array mit 0-Bytes
furchtbar. falsch. undefiniert.
Wenn du Initialisierung mit 0 willst, ist nichts weiter zu tun:
int *test::zrg_arr[10];Das Array wird ohnehin statisch zero-initialisiert.
Ein bißchen expliziter - und daher imo besser - ist ein expliziter Initialisierer:
int *test::zrg_arr[10] = {};Das drückt aus, dass wir die Initialisierung nicht einfach vergessen haben - aber die Initialisierung mit 0 das richtige ist.
Eine Initialisierung mit etwas anderem als 0 kann nur über die erwähnte Initialisierungsliste erfolgen - oder man benutzt eine Funktion, um nur die Elemente, die von 0 verschieden sein sollen, zu ändern (das ist technisch gesehen allerdings keine Initialisierung).
-
camper schrieb:
crashterpiece schrieb:
memset(zrg_arr, 0, 10*sizeof(int));füllt das Array mit 0-Bytes
furchtbar. falsch. undefiniert.
meinst du mit 'undefiniert' das fehlende '*'?
memset(zrg_arr, 0, 10*sizeof(int*));furchtbar, aber nicht undefiniert. oder?
-
lemurenkönig schrieb:
camper schrieb:
crashterpiece schrieb:
memset(zrg_arr, 0, 10*sizeof(int));füllt das Array mit 0-Bytes
furchtbar. falsch. undefiniert.
meinst du mit 'undefiniert' das fehlende '*'?
memset(zrg_arr, 0, 10*sizeof(int*));furchtbar, aber nicht undefiniert. oder?
undefiniert deshalb, weil die Repräsentation 0-pointer nicht zwingend aus 0-Bytes besteht. Falsch wegen dem fehlenden *. Furchtbar, weil solche size-Ausdrücke sich wo immer möglich auf das Objekt und nicht auf den Typen beziehen sollten - das ist sonst so etwas ähnliches wie eine magische Konstante; es muss immer mit der Variablendeklaration geändert werden. Also (ignorieren wir das im Standard undefinierte):
memset(zrg_arr,0,sizeof zrg_arr);und schließlich gibt es dafür Algorithmen:
fill_n(zarg_arr,sizeof zarg_arr/sizeof *zarg_arr,0);das ist dann nicht undefiniert.
-
ok, ein array aus zeigern würde ich so nicht initialisieren, da gehe ich lieber den weg über eine schleife
aber bei einem reinen integer-feld mach ich das grundsätzlich so :p