PDA

Visualizza la versione completa : [C++] Classe Vettore che contiene un array di oggetti


nostradamus1915
17-01-2013, 17:25
Questo dovrebbe essere l'ultimo tassello mancante alla mia preparazione.

Facciamo un esempio semplice:
Ho la classe studenti (che per semplicità conterrà solo l'attributo protected età). Poi ho una classe Vettore che prevede le seguenti variabili membro:
- V di tipo puntatore, contiene il riferimento al vettore di studenti allocato dinamicamente
- Nelem, variabile di tipo intero, rappresenta il numero massimo di elementi del vettore
La classe Vettore fornisce le seguenti funzionalità:
- overloading delle funzioni di accesso []
- funzioni get per ciascuna delle variabili membro

Ho realizzato la classe studente in questo modo:

class studente{
protected:
int eta;
public:
//costr
studente(int e=0){
eta=e;
}

//gets
int getE() const { return eta; }

//sets
void setE(int e) { eta=e; }
};

E la classe vettore così:

class vettore:public studente{
protected:
studente v[100];
studente *p;
public:

studente operator[](int i){
p=&v[i];
return *p;
}

//get
};

L'overload della funzione [] non mi funziona, ovvero se per esempio nel main faccio:


vettore vet;

vet[0].setE(17);

cout << vet[0].getE() << endl;

system("PAUSE");
return EXIT_SUCCESS;
Mi stampa 0

Sia sui lucidi messi a disposizione dal prof che sul libro non c'è niente a riguardo, ne ho trovato qualcosa su internet.
Qualcuno sa come si fa?

MItaly
17-01-2013, 18:13
Il problema sta nell'operator[]; tutto quel magheggio con il puntatore non serve a niente, di fatto il tuo codice è equivalente a:


studente operator[](int i) {
return v[i­];
}

che restituisce una copia di v[­i]; per cui, nel momento in cui tu fai:

vet[0].setE(17);
la setE viene richiamata sull'oggetto temporaneo restituito da operator[], che è una copia di v.v[0]. Quello che devi fare è restituire un reference all'elemento in questione:


studente & operator[](int i) {
return v[i­];
}


In questa maniera non viene restituita una copia di v, ma un [i]riferimento ad esso, tramite il quale dall'esterno si fa riferimento all'elemento originale.

nostradamus1915
17-01-2013, 18:30
Ecco avevo intuito che il problema risiedesse nel fatto che passavo il valore e non l'indirizzo, solo non avevo idea che si potesse mettere l'& prima di operator :incupito:
Ti ringrazio ancora dell'aiuto, ciao :D

MItaly
17-01-2013, 18:35
Originariamente inviato da nostradamus1915
Ecco avevo intuito che il problema risiedesse nel fatto che passavo il valore e non l'indirizzo, solo non avevo idea che si potesse mettere l'& prima di operator :incupito:
Occhio: non è questione di "mettere & prima di operator" come se fosse un caso speciale, semplicemente il tipo restituito da "studente" diventa "studente &" (riferimento ad un oggetto di tipo studente); se la cosa non ti è chiarissima ti consiglio di ripassare il capitolo relativo ai reference del tuo libro di C++.


Ti ringrazio ancora dell'aiuto, ciao :D
:ciauz:

(tra parentesi, il linguaggio di riferimento va sempre indicato nel titolo della discussione come "tag", qui lo aggiungo io, in futuro ricordatene)

Loading