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 - Pagina 2

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
sarbaturino (Normal User)
Pro


Messaggi: 66
Iscritto: 25/04/2011

Segnala al moderatore
Postato alle 13:55
Mercoledì, 04/01/2012
Io il costruttore di copia non ne ho mai utilizzato, perkè non ho mai riscontrato la sua utilità..

Poi per il fatto di assegnare dei valori a degli oggetti privati o protetti di una classe attraverso a delle funzioni public, in modo da aggirare la protezione l'ho sempre utilizzato e penso che sia abbastanza utile..

Non ho capito abbastanza bene il tuo algoritmo, mi potresti spiegare cosa dovresti fare in quel algoritmo??
Così, tanto per allenarmi cercherò di farlo anche io..

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 15:14
Mercoledì, 04/01/2012
L'errore è sottile ma abbastanza comune per chi, come te, sta imparando la programmazione ad oggetti focalizzandosi sull'eredità singola tra classi.

Partendo dal presupposto che:
- TUTTI gli oggetti (intendo attributi e funzioni membro*), con specificatore ad accesso private, sono accessibili solo e solamente all'interno della classe in cui sono stati dichiarati.
- TUTTI gli oggetti (...), con specificatore ad accesso protected, sono accessibili solo e solamente all'interno della classe, in cui sono stati dichiarati, e all'interno delle classi derivate.
- TUTTI gli oggetti (...), con specificatore ad accesso public, sono accessibili dall'esterno ma anche dall'interno.

poi ci sono le funzioni friend ma quello è un altro discorso.

Riallacciandoci alla teoria, spiegata poc'anzi, focalizziamo in dettaglio la parte errata del tuo codice:
Codice sorgente - presumibilmente C/C++

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


Da premettere che n_station è una variabile di tipo intero con specificatore ad accesso protected. Ricordiamo ancora una volta che una variabile con specificatore ad accesso protected può essere modificata solo all'interno della classe padre (= classe base) e classi figlie (= classi derivate). Riassumendo tutto, il valore della variabile può essere modificato esclusivamente dal puntatore this. Quindi l'oggetto stesso...

Traendo le conclusioni, line è un vettore di tipo Assembly_line, dove la variabile n_station non è public bensì protected. Dal momento che non è modificata dall'oggetto this, è impossibile modificarla. Una soluzione al problema è quello di impostare la variabile n_station come public ma è una soluzione brutta se ci tieni (come me) all'eleganza del codice. Una soluzione degna di nota è impostare tutti gli attributi come private e, nella classe base, inserire tutti i metodi setter, per settare,  e getter, per ritornare, delle varie variabili impostate precedentemente come private.

Di seguito un esempio:
Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. std::ostream &pause( std::ostream &output )
  4. {
  5.         output << "Premere invio per concludere ... ";
  6.         std::cin.get();
  7.         return output;
  8. }
  9.  
  10. class Padre
  11. {
  12. public:
  13.         void setVariabile( int dato ) // la funzione è inline
  14.         {
  15.                 numero = dato;
  16.         }
  17.  
  18.         int getVariabile() // la funzione è inline
  19.         {
  20.                 return numero;
  21.         }
  22.        
  23. private:
  24.         int numero;
  25. };
  26.  
  27. class Figlio : public Padre
  28. {
  29. };
  30.  
  31. int main()
  32. {
  33.         Figlio myFiglio;
  34.         myFiglio.setVariabile( 3 ); // chiama il metodo della classe padre, in quanto non è stato ridefinito nella classe figlio
  35.         std::cout << myFiglio.getVariabile() << std::endl << pause; // stessa cosa qui.
  36.  
  37.         return 0;
  38. }


Ultima modifica effettuata da Pitagora il 04/01/2012 alle 15:17
PM Quote
Avatar
Neo25 (Normal User)
Newbie


Messaggi: 16
Iscritto: 29/09/2011

Segnala al moderatore
Postato alle 15:28
Mercoledì, 04/01/2012
okok...nel mio caso il set gia ce li ho anche se si chiama build_assembly_line...devo mettere solo i get quindi mmm Grazie mille ;)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo