Oppure

Loading
04/01/12 10:55
Neo25
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:
class Assembly_line //classe base
 {
protected:
    vector <Station> station; //attributi classe base
   int time_line_entry;
   int time_line_exit;
   int n_station;
   vector <int> f;
    vector <int> l;
   public:
   Assembly_line()
   {
      time_line_entry=0;
      time_line_exit=0;
      n_station=0;
      
   }
void build_assembly_line(int time1,int time2,int n) 
{
    time_line_entry=time1;
    time_line_exit=time2;
    n_station=n;
    
}
 ~Assembly_line(){}
};

class Function_Assembly_line:public Assembly_line{ //classe derivata
    
public:
    Function_Assembly_line(){
    }
    void fastest_way(int x,vector <Assembly_line> line){
        line[x].n_station=1; // QUI C'E' il problema:
    }                       // perchè non posso accedere a
                                    //quell' attributo ?
};



int main(int argc, char *argv[]){
  vector <Assembly_line> line; //Array di oggetti classe base
   Function_Assembly_line l;    // Oggetto classe derivata
  srand((unsigned int)time(0));
 for(int i=1;i<=x;i++){
      int a,b;
      a=1+rand()%30;
      b=1+rand()%30;
     line[i].build_assembly_line(a,b,s);
     
  }
   l.fastest_way(x,line); //Chiamata metodo in cui ho il problema
   // system("pause");    // come vedete gli passo l'array di oggetti 
	return 0;
}        


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. :)
aaa
04/01/12 12:11
sarbaturino
Sto cercando di capire l'algoritmo ma nel frattempo prova a sostituire public della riga 28 con protected, compila e fammi sapere.
aaa
04/01/12 12:19
Neo25
Mi da lo stesso problema...dice che n_station è protected :-o
aaa
04/01/12 12:20
sarbaturino
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;


aaa
04/01/12 12:25
Neo25
Mi da lo stesso problema...dice che n_station è protected :-o
aaa
04/01/12 12:31
sarbaturino
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.
aaa
04/01/12 12:38
Neo25
Capito...però dovrei fare questo per ogni attributo che mi serve poi giusto? mmm...
Non conviene un costruttore copia? mmm..
aaa
04/01/12 12:40
sarbaturino
Ma come ti ho detto funziona?
aaa