Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Classe Vettore che contiene un array di oggetti

    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:
    codice:
    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ì:
    codice:
    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:

    codice:
    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?

  2. #2
    Il problema sta nell'operator[]; tutto quel magheggio con il puntatore non serve a niente, di fatto il tuo codice è equivalente a:
    codice:
    studente operator[](int i) {
        return v[i­]; 
    }
    che restituisce una copia di v[­i]; per cui, nel momento in cui tu fai:
    codice:
    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:
    codice:
    studente & operator[](int i) {
        return v[i­]; 
    }
    In questa maniera non viene restituita una copia di v[i­], ma un riferimento ad esso, tramite il quale dall'esterno si fa riferimento all'elemento originale.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    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
    Ti ringrazio ancora dell'aiuto, ciao

  4. #4
    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
    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


    (tra parentesi, il linguaggio di riferimento va sempre indicato nel titolo della discussione come "tag", qui lo aggiungo io, in futuro ricordatene)
    Amaro C++, il gusto pieno dell'undefined behavior.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.