Tata, mislim da si u pravu, ali delimicno.
Postupak ubacivanja objekta ide ovako:
Code:
array<covek> a;
a(0).inic ();
a(1).inic ();
a(2).inic ();
operator() vraca &covek, i pritom vodi racuna da alocira dovoljno prostora za novi objekat (ako je potrebno) : allocated+sizeof(T);
Jedina mana je sto inic() mora da ti bude konstruktor, a pravi konstruktor mora da poziva inic().
Isto i za destruktor.
Ovo vazi u slucaju da bas hoces objekte da trpas u niz.
Sa pointerima nema problema:
Code:
array<covek *> a;
a(0) = new covek;
a(1) = new covek;
a(2) = new covek;
No, da se vratimo na ovo prvo.
Kako ti mislis da nateram
new da kreira objekat tamo gde ja hocu (u nizu, gde je rezervisana memorija) ?
Ja tu tehniku ne poznajem.
Da li to postoji u STL biblioteci?
P.S. Ja pojma nemam sta sve STL klase mogu, ali ovo moja klasa sama kreira podnizove (mozes da imas koliko hoces dimenzija), zatim mozes da obrises niz (u bilo kojoj dimenziji), mozes rucno da alociras memoriju u nekom nizu, mozes da je dealociras, mozes da vidis duzinu niza, mozes da vidis koliko podnizova ima neki niz (u bilo kojoj dimenziji), mozes da ispitas da li odredjeni podniz postoji, mozes da kopiras neku memoriju/string u nekom nizu, i mozes da pristupis bilo kom bajtu, preko funkcije koja vraca void* na trazeni bajt, pa tako mozes da ubacis/procitas sta hoces na bilo kom mestu.
Sve ovo uz automatsku alokaciju.
Ako uradis recimo :
Code:
niz[5][2][8][4][3][9](5) = 55;
zauzeces svega nekih 70 bajta, jer se alociraju samo podnizovi, samo 'putanja', a ne cela objast.
I mozes u jedan podniz da drzis babe, a u drugi podniz zabe, i nema gazenja :)
Evo primera:
Code:
void example1 ()
{
papi::array<int> a;
a(0) = 0;
a(1) = 1;
a(2) = 2;
a(3) = 3;
a(4) = 4;
a[1](0) = 10;
a[1](1) = 11;
a[1](2) = 12;
a[1][8](5) = 185;
printf ("[0] = %i\n", a(0) );
printf ("[1] = %i\n", a(1) );
printf ("[2] = %i\n", a(2) );
printf ("[3] = %i\n", a(3) );
printf ("[3] = %i\n", a(4) );
printf ("[1][0] = %i\n", a[1](0) );
printf ("[1][1] = %i\n", a[1](1) );
printf ("[1][2] = %i\n", a[1](2) );
printf ("[1][8][5] = %i\n", a[1][8](5) );
printf ("array's root have : %i data cells\n", a.length());
printf ("array's root have : %i sub-arrays\n", a.sa_length());
printf ("[1] have : %i data cells\n", a[1].length());
printf ("[1] have : %i sub-arrays\n", a[1].sa_length());
printf ("[1][8] have : %i data cells\n", a[1][8].length());
printf ("[1][8] have : %i sub-arrays\n", a[1][8].sa_length());
}
void example2 ()
{
papi::array<char> a;
a.copy ("Countries");
a[0].copy ("Europe");
a[0][0].copy ("Serbia and Montenegro");
a[0][1].copy ("France");
a[0][2].copy ("Germany");
a[0][3].copy ("Englend");
a[0][4].copy ("Italy");
a[1].copy ("Asia");
a[1][0].copy ("Rusia");
a[1][1].copy ("China");
a[1][2].copy ("Japan");
a[1][3].copy ("India");
a[1][4].copy ("Pakistan");
a[2].copy ("Africa");
a[2][0].copy ("Nigeria");
a[2][1].copy ("Egypt");
a[2][2].copy ("Tunis");
a[2][3].copy ("Maroko");
a[2][4].copy ("Etiopia");
a[3].copy ("Australia & Oceania");
a[3][0].copy ("Australia");
a[3][1].copy ("New Zeland");
a[4].copy ("North America");
a[4][0].copy ("Brasil");
a[4][1].copy ("Argentina");
a[4][2].copy ("Columbia");
a[5].copy ("South America");
a[5][0].copy ("USA");
a[5][1].copy ("Canada");
a[5][2].copy ("Cuba");
a[5][3].copy ("Puerto Rico");
a[6].copy ("Grenland");
a[6][0].copy ("Grenland");
printf ("- %s\n", a.p() );
int i;
for (int j=0; j<a.sa_length(); j++)
if (a.sa_exist(j))
{
printf ("--- %s\n", a[j].p() );
for (i=0; i<a[j].sa_length(); i++)
if (a[j].sa_exist(i))
printf ("------ %s\n", a[j][i].p() );
}
}
void example3 ()
{
papi::array<char> a;
a[1](0) = 'a';
a[1](1) = 'b';
*(int *)a[0].vp(0) = 10;
*(int *)a[0].vp(4) = 14;
a[1](2) = 'c';
a[1](3) = 'd';
printf ("a[0](0) = %i\n", *(int *)a[0].vp(0) );
printf ("a[0](1) = %i\n", *(int *)a[0].vp(4) );
printf ("a[1](0) = %c\n", a[1](0) );
printf ("a[1](1) = %c\n", a[1](1) );
printf ("a[1](2) = %c\n", a[1](2) );
printf ("a[1](3) = %c\n", a[1](3) );
}
Zar je toliko lose sto sam napravio ovo? :)