vorhandene Instanzen einer Klasse um 1 erhöhen?
-
Hi,
ich bin gerade dabei mir eine Speicherklasse für eine spezielle Datenstruktur auszudenken. Sie hat halt bestimmte Eigenschaften die mir die Arbeit wesentlich erleichtern.
Später will ich diese Klasse wie eine Variable benutzen (also wie die Klasse CString). Das bedeutet aber auch das ich ein Array von dieser Speicherklasse hab und anfangs eine feste Größe Initialisieren muss, z.B. so:
SpeicherKlasse iDatenStruktur[50];
Allerdings ist eine feste größe eher unpraktisch das die Anzahl der benötigten Felder mal größer und mal kleiner ist.
Wie kriege ich jetzt also aus "iDatenStruktur[50]" in der Laufzeit eine "iDatenStruktur[60]"?
-
garnicht.
deshalb ist es sinnvoll hier den Speicher dynamisch anzulegen (siehe new/delete und uU auch vector)
-
hm... dann müsste ich jedesmal wenn das array voll ist mit new ein neues größeres machen und das alte dann rüberkopieren... ?
-
Chris++ schrieb:
hm... dann müsste ich jedesmal wenn das array voll ist mit new ein neues größeres machen und das alte dann rüberkopieren... ?
Oder du nimmst gleich std::vector.
-
Chris++ schrieb:
hm... dann müsste ich jedesmal wenn das array voll ist mit new ein neues größeres machen und das alte dann rüberkopieren... ?
ja
-
Dazu brauchst Du auf jeden Fall Zeiger.
Wenn Du ein int-Array mit 5 Elementen anlegst machst Du eigentlich folgendes:int * pIntArray; int anzahlElemente = 5; pIntArray = (int*) malloc( sizeof(int) * anzahlElemente); pIntArray[0] = 10;
Um die Größe des Feldes auf 10 zu vergrößern musst Du nun einfach zusätzlichen Speicher allocieren:
anzahlElemente = 10; pIntArray = (int*) realloc( (void*)pIntArray, ( sizeof(int) * anzahlElemente ));
Dabei wird weiterer Speicher direkt hinter dem bereits allocierten Speicher allociert. Sollte dort kein Platz sein wird das komplette Array in einen anderen Speicherbereich verschoben.
-
das wird ja nicht nur ein "einfaches Array". Da kommen auch Funktionen rein mit der ich die grad ausgewählte Instanz sofort in eine Dateischreiben kann usw...
-
Chris0815 schrieb:
Dazu brauchst Du auf jeden Fall Zeiger.
Wenn Du ein int-Array mit 5 Elementen anlegst machst Du eigentlich folgendes:int * pIntArray; int anzahlElemente = 5; pIntArray = (int*) malloc( sizeof(int) * anzahlElemente); pIntArray[0] = 10;
Um die Größe des Feldes auf 10 zu vergrößern musst Du nun einfach zusätzlichen Speicher allocieren:
anzahlElemente = 10; pIntArray = (int*) realloc( (void*)pIntArray, ( sizeof(int) * anzahlElemente ));
Dabei wird weiterer Speicher direkt hinter dem bereits allocierten Speicher allociert. Sollte dort kein Platz sein wird das komplette Array in einen anderen Speicherbereich verschoben.
Ich könnt mir Vorstellen das die Funktion Grow() (oder so ähnlich) von CString(Array) so funktioniert... das müsste alles Intern laufen sodas ich die instanzen von aussen nur als Variablen betrachten brauche.
-
Chris++ schrieb:
Ich könnt mir Vorstellen das die Funktion Grow() (oder so ähnlich) von CString(Array) so funktioniert... das müsste alles Intern laufen sodas ich die instanzen von aussen nur als Variablen betrachten brauche.
jo, so wird sie funktionieren. bzw. uU auch mit new statt malloc/realloc aber die Idee ist immer gleich. Anders kann man mit Arrays nicht arbeiten. Gute Allokierungsstrategie ist deshalb besonders wichtig.
uU willst du aber kein Array sondern zB eine liste?
hängt halt davon ab, was du genau machen willst...
-
ich brauch ein Array, da ich auf die einzelnen Elemente dynamisch zugreifen muss.
man das wird ne geile Speicherklasse
wenn ich sie hinkrig.