Oppure

Loading
04/01/12 12:48
Neo25
Si va benissimo...ma consigli questo o un costruttore copia? mmm
aaa
04/01/12 12:55
sarbaturino
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..
aaa
04/01/12 14:14
Pitagora
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:
    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 ?
   

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:
#include <iostream>

std::ostream &pause( std::ostream &output )
{
	output << "Premere invio per concludere ... ";
	std::cin.get();
	return output;
}

class Padre
{
public:
	void setVariabile( int dato ) // la funzione è inline
	{
		numero = dato;
	}

	int getVariabile() // la funzione è inline
	{
		return numero;
	}
	
private:
	int numero;
};

class Figlio : public Padre
{
};

int main()
{
	Figlio myFiglio;
	myFiglio.setVariabile( 3 ); // chiama il metodo della classe padre, in quanto non è stato ridefinito nella classe figlio
	std::cout << myFiglio.getVariabile() << std::endl << pause; // stessa cosa qui.

	return 0;
}
Ultima modifica effettuata da Pitagora 04/01/12 14:17
aaa
04/01/12 14:28
Neo25
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 ;)
aaa