Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Problema Ereditarietà e accesso attributi
Forum - C/C++ - Problema Ereditarietà e accesso attributi

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Neo25 (Normal User)
Newbie


Messaggi: 16
Iscritto: 29/09/2011

Segnala al moderatore
Postato alle 11:55
Mercoledì, 04/01/2012
Salve ragazzi. Come dice il titolo ho un problema riguardo all'accesso di attributi di un oggetto.
Io ho una classe base con attributi protected appunto per poterli ereditare. Nel main dichiaro una array di oggeti di questa classe.

Quando creo la classe derivata in modo public ho tutti i metodi e attributi a disposizione. In un metodo di questa classe derivata gli passo anche l'array di oggetti della classe. Il problema è che non riesco ad accedere agli attributi di quello oggetto.
Questo è il codice:
Codice sorgente - presumibilmente C#

  1. class Assembly_line //classe base
  2.  {
  3. protected:
  4.     vector <Station> station; //attributi classe base
  5.    int time_line_entry;
  6.    int time_line_exit;
  7.    int n_station;
  8.    vector <int> f;
  9.     vector <int> l;
  10.    public:
  11.    Assembly_line()
  12.    {
  13.       time_line_entry=0;
  14.       time_line_exit=0;
  15.       n_station=0;
  16.      
  17.    }
  18. void build_assembly_line(int time1,int time2,int n)
  19. {
  20.     time_line_entry=time1;
  21.     time_line_exit=time2;
  22.     n_station=n;
  23.    
  24. }
  25.  ~Assembly_line(){}
  26. };
  27.  
  28. class Function_Assembly_line:public Assembly_line{ //classe derivata
  29.    
  30. public:
  31.     Function_Assembly_line(){
  32.     }
  33.     void fastest_way(int x,vector <Assembly_line> line){
  34.         line[x].n_station=1; // QUI C'E' il problema:
  35.     }                       // perchè non posso accedere a
  36.                                     //quell' attributo ?
  37. };
  38.  
  39.  
  40.  
  41. int main(int argc, char *argv[]){
  42.   vector <Assembly_line> line; //Array di oggetti classe base
  43.    Function_Assembly_line l;    // Oggetto classe derivata
  44.   srand((unsigned int)time(0));
  45.  for(int i=1;i<=x;i++){
  46.       int a,b;
  47.       a=1+rand()%30;
  48.       b=1+rand()%30;
  49.      line[i].build_assembly_line(a,b,s);
  50.      
  51.   }
  52.    l.fastest_way(x,line); //Chiamata metodo in cui ho il problema
  53.    // system("pause");    // come vedete gli passo l'array di oggetti
  54.         return 0;
  55. }



Il compilatore diche che non posso perchè sono protected...e quindi dovrei metterli publc. Ma non posso permettere che quegli attributi siano pubblici ma devo trovare un modo di potergli accedere dalla classe derivata.
Sperdo di essere stato chiaro.
Grazie in anticipo. :)

PM Quote
Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 13:11
Mercoledì, 04/01/2012
Sto cercando di capire l'algoritmo ma nel frattempo prova a sostituire public della riga 28 con protected, compila e fammi sapere.

PM Quote
Avatar
Neo25 (Normal User)
Newbie


Messaggi: 16
Iscritto: 29/09/2011

Segnala al moderatore
Postato alle 13:19
Mercoledì, 04/01/2012
Mi da lo stesso problema...dice che n_station è protected :-o

PM Quote
Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 13:20
Mercoledì, 04/01/2012
Nella classe base, cioè Assembly_line, inserisci una funzione nel campo public in grado di settare l'attributo n_station della riga 7;
Ad esempio:

void set_n_station(const int Numero)
{
       n_station=Numero;
}

Poi all'interno della classe Ereditata, sostituisci la riga 34 in questo modo:

line[x].set_n_station (1);

Prova e fammi sapere;



PM Quote
Avatar
Neo25 (Normal User)
Newbie


Messaggi: 16
Iscritto: 29/09/2011

Segnala al moderatore
Postato alle 13:25
Mercoledì, 04/01/2012
Mi da lo stesso problema...dice che n_station è protected :-o

PM Quote
Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 13:31
Mercoledì, 04/01/2012
Ma hai inserito la funzione set_n_station nella parte public della classe base??

Per in questo moto tu riesci ad aggirare la protezione dell'oggetto n_station.
In pratica, invece di fare un assegnamento diretto con quella funzione l'assegnamento lo fai attraverso una funzione public che a sua volta può accedere agli oggetti privati o protetti della classe base.

PM Quote
Avatar
Neo25 (Normal User)
Newbie


Messaggi: 16
Iscritto: 29/09/2011

Segnala al moderatore
Postato alle 13:38
Mercoledì, 04/01/2012
Capito...però dovrei fare questo per ogni attributo che mi serve poi giusto? mmm...
Non conviene un costruttore copia? mmm..

PM Quote
Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 13:40
Mercoledì, 04/01/2012
Ma come ti ho detto funziona?

PM Quote
Avatar
Neo25 (Normal User)
Newbie


Messaggi: 16
Iscritto: 29/09/2011

Segnala al moderatore
Postato alle 13:48
Mercoledì, 04/01/2012
Si va benissimo...ma consigli questo o un costruttore copia? mmm

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo