Behöver hjälp gällande arrays och objekt!!

Permalänk

Behöver hjälp gällande arrays och objekt!!

Tjena allihop,

har stött på lite problem och behöver hjälp!

Nedan i exempel 1 så generar jag en array som håller 10 objekt från klassen C_Class, sedan så skapar jag 10 st pekare som jag sedan med hjälp av for loopen får pekarna att peka mot objekten som skapats med hjälp av arrayen.
Detta fungerar, men nackdelen med detta är att jag måste veta antalet objekt jag ska använda före jag kompilerar koden.
Om vi säger att jag vet antalet objekt jag behöver använda i taget låt oss säga 10 st som ett exempel så kan jag återanvända pekarna och behöver därför inte generera nya, men om jag behöver 100 objekt så vill jag kunna skapa 10 st åt gången sedan förstöra de gamla objekten för att kunna återanvända platserna i minnet.

Jag har tänkt mig något i stilen av exempel 2 men att jag måste förmodligen byta arrayen mot en vektor eller lista, men vet inte riktigt hur jag ska konvertera så om någon skulle kunna peka mig i rätt riktning så skulle det uppskattas!

Kan vara så att jag har fel i min förklaring, är inte jätte duktig på C++ så tar absolut inte illa upp om någon vill rätta mig så att jag tänker rätt till nästa gång.

Tack på förhand!

Exempel 1

static int s_Obj_Number = 0; const int pointer_ArraySize = 10; C_Class a_Obj[10]; C_Class *p_Array_Obj[pointer_ArraySize]; for(int spot = 0; spot < pointer_ArraySize; spot++){ p_Array_Obj[spot] = &a_Obj[s_Obj_Number]; s_Obj_Number++; }

Exempel 2

static int s_Obj_Number = 0; const int pointer_ArraySize = 10; C_Class a_Obj[s_Obj_Number]; // Går inte eftersom man måste ha ett constant värde på en arrays storlek C_Class *p_Array_Obj[pointer_ArraySize]; for(int spot = 0; spot < pointer_ArraySize; spot++){ p_Array_Obj[spot] = &a_Obj[s_Obj_Number]; s_Obj_Number++; }

Permalänk
Medlem

Du programmerar c och inte c++ i exemplet och du behöver allokera objekten om du inte har vill ha statiska värden isåfall.

Varför vill du återanvända minnet? Begränsat minne eller använder du bara en begränsad mängd objekt åt gången.
Ser ut som du försöker gör någon variant på multidimensionell array

Permalänk
Medlem

//#include <vector> static int s_Obj_Number = 0; const int pointer_ArraySize = 10; vector<C_Class> v_Obj; C_Class *p_Array_Obj[pointer_ArraySize]; for(int spot = 0; spot < pointer_ArraySize; spot++){ v_Obj.push_back(C_Class()); p_Array_Obj[spot] = &v_Obj.at(s_Obj_Number); s_Obj_Number++; }

Det är väl C++?

Förövrigt vill du inte göra så här, eftersom innehållet i en vektor (även array) byter minnesplats med jämna mellanrum, vilket gör att dina pekare pekar på fel sak och alltihop kraschar efter ett tag.

vector<C_Class*> v_Obj; v_Obj.push_back(new C_Class()); p_Array_Obj[spot] = v_Obj.at(s_Obj_Number);

Om man gör så här istället är det däremot alltid lugnt.

Permalänk
Datavetare

Exempel 2 kan göras förutsatt att variabeln du använder som längd till array:en är ett argument. D.v.s. så här

void foo(int s_Obj_Number) { const int pointer_ArraySize = 10; C_Class a_Obj[s_Obj_Number]; C_Class *p_Array_Obj[pointer_ArraySize]; for(int spot = 0; spot < pointer_ArraySize; spot++){ p_Array_Obj[spot] = &a_Obj[s_Obj_Number]; s_Obj_Number++; } } int main() { foo(10); foo(100); }

Detta fungerar även i C99.

Edit: detta exempel är fel, lämnar kvar det som en övning att lura ut exakt vilken typ av del detta orsakar. Är något som kan ge väldigt konstiga krascher

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Datavetare

Ett annat sätt är templates

template <int obj_number_sz> void foo () { int s_Obj_Number = 0; const int pointer_ArraySize = 10; C_Class a_Obj[obj_number_sz]; C_Class *p_Array_Obj[pointer_ArraySize]; for(int spot = 0; spot < pointer_ArraySize; spot++){ p_Array_Obj[spot] = &a_Obj[s_Obj_Number]; } } int main() { foo<10>(); foo<100>(); }

Vilket även visar att 's_Obj_Number' användes på ett sätt som havererar version 2 ovan
Den måste var så här

void foo(int obj_number_sz) { int s_Obj_Number = 0; const int pointer_ArraySize = 10; C_Class a_Obj[obj_number_sz]; C_Class *p_Array_Obj[pointer_ArraySize]; for(int spot = 0; spot < pointer_ArraySize; spot++){ p_Array_Obj[spot] = &a_Obj[s_Obj_Number]; s_Obj_Number++; } } int main() { foo(10); foo(100); }

Personligen gillar jag inte kod av typen '&array[index]', detta talar bättre om vad man gör 'array + index'

void foo(int obj_number_sz) { int s_Obj_Number = 0; const int pointer_ArraySize = 10; C_Class a_Obj[obj_number_sz]; C_Class *p_Array_Obj[pointer_ArraySize]; for(int spot = 0; spot < pointer_ArraySize; spot++){ p_Array_Obj[spot] = a_Obj + s_Obj_Number; s_Obj_Number++; } } int main() { foo(10); foo(100); }

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer