PDA

View Full Version : [C++] Nuovo capitolo nuovo esercizio


Brazorv
27-06-2005, 18:37
Dopo il finesettimana ripreso a studiare c++ ho fatto un nuovo capitolo e sto facendo un esercizio.
Devo implementare una classe IntegerSet che rappresenta un insieme di interi che può contenere numeri da 0 a 100. L'esercizio chiede di implementarla con un array di 101 elementi, in cui l'iesimo elemento vale 1 se i è presente nell'insieme, 0 se non è presente. Questa è la dichiarazione delle mia classe
#ifndef INTEGERSET_H
#define INTEGERSET_H

class IntegerSet{
public:
IntegerSet();
IntegerSet(int,int=-1,int=-1,int=-1,int=-1);
~IntegerSet();
int insertElement(int);
void deleteElement(int);
void setPrint() const;
bool isEqualTo(const IntegerSet &) const;
IntegerSet unionOfSet(const IntegerSet &) const;insiemi
IntegerSet intersectionOfSet(const IntegerSet &) const;
int getElements() const;
int getElement(int) const;nell'insieme 0 altrimenti
private:
int *set; // array che contiene gli elementi dell'insieme
int elements; // numero di elementi presenti nell'insieme
void initialize();
};

#endif

Devo fare 2 costruttori uno che non prende argomenti e restituisce un insieme vuoto e l'altro che prende da 1 a 5 elementi e crea un insieme che contiene gli elementi che ho passato, questi sono i costruttori che ho fatto:
IntegerSet::IntegerSet(){
initialize();
}

IntegerSet::IntegerSet(int a, int b, int c,int d,int e){
initialize();
insertElement(a);
insertElement(b);
insertElement(c);
insertElement(d);
insertElement(e);
}

IntegerSet::~IntegerSet(){
delete [] set;
}

void IntegerSet::initialize(){
set = new int[MAX_ELE];
for(int i=0; i<MAX_ELE; i++)
set[i]=0;
elements=0;
}

Prima di fare questa versione ne ho fatto un'altra che non funzionava era così:
IntegerSet::IntegerSet(){
set = new int[MAX_ELE];
for(int i=0; i<MAX_ELE; i++)
set[i]=0;
elements=0;
}

IntegerSet::IntegerSet(int a, int b, int c,int d,int e){
IntegerSet();
insertElement(a);
insertElement(b);
insertElement(c);
insertElement(d);
insertElement(e);
}

IntegerSet::~IntegerSet(){
delete [] set;
}

questa mi restituiva sempre un insieme vuoto.
i miei dubbi sono:
si può chiamare un costruttore all'interno di un altro costruttore?
posso fare in modo che la funzione initialize sia chiamata una sola volta, cioè solo quando l'oggetto viene creato?
poi l'ultimo dubbio riguarda il distruttore, mettendo
delete [] set;
sono sicuro che la memoria allocata nel costruttore venga liberata quando l'oggetto viene distrutto oppure devo fare qualcos'altro?

Scusate se il post è un pò lungo.

Brazorv
28-06-2005, 13:01
up

illy
28-06-2005, 14:29
per quel che ne so io un costruttoe dentro un costruttore si può fare. Il distruttore è corretto ma non ho capito qual'è il problema con il costruttore senza argomenti (initialize)

Brazorv
28-06-2005, 15:02
Il problema è che se io creo un oggetto così
IntegerSet a;
viene chiamato questo costruttore
IntegerSet::IntegerSet(){
set = new int[MAX_ELE];
for(int i=0; i<MAX_ELE; i++)
set[i]=0;
elements=0;
}
che crea un insieme vuoto inizializzando tutti gli elementi dell'array a 0 ed elemnts a 0, e questo funziona.
Invece se creo un oggetto così
IntegerSet a(5,6);
dovrebbe chiamare l'altro costruttore:
IntegerSet::IntegerSet(int a, int b, int c,int d,int e){
IntegerSet();
insertElement(a);
insertElement(b);
insertElement(c);
insertElement(d);
insertElement(e);
}

che a sua volta dovrebbe richiamare il costruttore per creare l'insieme vuoto poi inserire gli elementi 5 e 6. Il problema è che il primo costruttore non viene eseguito perche quando stampo il contenuto dell'insieme mi vengono fuori dei valori assurdi come se la memoria dell'array e della variabile elements non fosse inizializzata.

Spero di essermi spiegato meglio. :mc:

illy
30-06-2005, 01:14
ma in questa maniera non inserisci elementi c d e con valori assurdi?

Brazorv
30-06-2005, 08:46
ma in questa maniera non inserisci elementi c d e con valori assurdi?

No. Non ho postato il codice della insertElement
int IntegerSet::insertElement(int e){
if(e>=0 && e<MAX_ELE && elements<=MAX_ELE){
set[e]=1;
elements++;
return 1;
}
return -1;
}

se gli passo come argomento -1 (che è l'argomento di deafult per il costruttore) non inserisce niente.