lunedì 11 marzo 2013

C++ - Costruttore di copia, references, resize.




#include <stdio.h>
#include <stdlib.h>

struct vector {
int *_data;
unsigned _size;

//ridimensionamento vettore dinamico
void resize (unsigned size) {
if (_data)
free (_data);
_data = (int *) malloc (size*sizeof(int));
_size = size;
}

//Viene usato l'uno o l'altro costruttore a seconda dell'ARGOMENTO PASSATO
//costruttore "standard" se passo la dimensione (unsigned)
vector (unsigned size) {
_data = 0;//evita free di un indirizzo non allocato
resize (size);
}


//costruttore di copia, mettere const è OBBLIGATORIO perchè sia riconosciuto come costruttore di copia
vector (const vector& v) {
_data = 0;
resize (v._size());
*this = v;//creo un nuovo oggetto il cui indirizzo è quello dell'oggetto che passo come parametro
}

//overloading dell'operatore = per la copia di vettori
vector& operator= (const vector& v) {
if (_size!=v._size) {
free (_data);
_data = (int *) malloc (v._size*sizeof(int));
_size = v._size;
}
for (unsigned i=0;i<_size;++i) 
_data[i] = v[i];
return *this;//ritorno me stesso, ho il puntatore a cui allocare la variabile (che sarà un vettore)
}

unsigned size() const { return _size; }
int at (unsigned i) const { return _data[i]; }

const int& operator[] (unsigned i) const { return _data[i]; }
int& operator[] (unsigned i) { return _data[i]; }

void set (unsigned i, int val) {
_data[i] = val;
}

//distruttore
~vector() {
free (_data);
}
};

void vector_fill_rand (vector& v) {
unsigned i;
for (i=0;i<v.size();++i) 
//v.set(i,rand());
v[i] = rand();
}

void vector_print (const vector& v) {
unsigned i;
if (v.size())
printf ("%d",v[0]);
for (i=1;i<v.size();++i)
printf (",%d",v[i]);
printf ("\n");
}

double media (const vector& v) {
double dMedia = 0;
for (unsigned i=0;i<v.size();++i) 
dMedia += v.at(i);
return dMedia / v.size();
}

int main() {
vector v(10);

vector_fill_rand (v);
vector_print (v);

vector v2(v);//creo un vettore v2 uguale a v
//v2 = v;
vector_print (v2);

printf ("La media di v e' %f\n",media(v));
}

Nessun commento:

Posta un commento