Originariamente inviato da MItaly
Le classi string stile Java se non erro sono immutabili; ogni volta che applichi una modifica, di fatto ti viene restituita una nuova stringa. Sono le classi string stile C++ ad essere modificabili.
Si intendevo quelle, grazie per la precisazione.
Originariamente inviato da MItaly
No, string a questo punto sarebbe un tipo non POD (dato che contiene un puntatore a stringa gestito tramite costruttore e distruttore), per cui non lo puoi più trattare con malloc, realloc e free.
E' il puntatore all'interno di StringArray che verrà trattato con malloc() realloc() e free(), dato che è un puntatore a void, quindi solo un insieme di byte che conterrà i vari oggetti String, inizializzati normalmente con new e delete.
Ho buttato giù questo codice (quanto mi piace *_*), una specie di template scarno e senza una completa gestione degli errori, ma almeno ti fa capire il ragionamento che seguivo ed il ragionamento che si usa con gli array, che non sono strutture particolari, ma solamente un insieme di byte come tutti gli altri tipi.
codice:
class Container {
private:
void* arr;
int dim;
int sing_dim;
public:
Container (int dim_el) {
if (dim_el < 0)
return;
sing_dim = dim_el;
dim = 0;
arr = malloc(dim_el);
};
void* get (int pos) {
if ((pos < 0) || (pos > dim))
return 0;
void *t = malloc(sing_dim);
memcpy(t, (&arr+(pos*sing_dim)), sing_dim);
return t;
};
void* append (void* elem) {
void* t = realloc(arr, (dim+1)*sing_dim);
if (t == 0)
return 0;
arr = t;
void* tocopy = dim == 0 ? arr : &arr+(dim*sing_dim);
memcpy(tocopy, elem, sing_dim);
dim++;
return arr;
};
~Container() {
free(arr);
};
};
/* BLOCCO D'UTILIZZO */
{
Container c(sizeof(int));
int num = 23;
c.append(&num);
num = 323;
c.append(&num);
int *elem0 = (int*)c.get(0);
int *elem = (int*)c.get(1);
if ((elem0 == 0) || (elem == 0))
return 1;
}
Questa programmazione è stata sostituita dai template con il C++, ma secondo me rimane una bella esperienza che ti fa capire molte cose.