Originariamente inviato da lucagiuliodori8
Si effettivamente anche io avevo pensato di usare un vettore di double ma poi la necessità di usare uno stream è nata dal fatto che potrei non conoscere la lunghezza e il tipo di dati in ingresso.
Se è per questo a un vector si possono aggiungere elementi tramite una pusk_back, quindi la lunghezza non è un problema. Il tipo di dati, hai detto che devono essere double quindi non vedo il problema.
In ogni caso come potrei implementare:
ostream << classe_componente;
istream >> classe_componente;
Hai due strade:
la prima e più semplice è definire la coppia di operatori per ogni singola classe.
codice:
class Componente {
public:
friend std::ostream& operator<<(std::ostream& os, const Componente& comp) {
// qui si ha accesso a ogni dato privato.
}
friend std::istream& operator>>(std::istream& os, Componente& comp) {
// qui si ha accesso a ogni dato privato.
}
};
La seconda prevede lo stesso schema, ma solo nella classe base e l'accesso alle classi derivate avviene attraverso una o più funzioni virtuali.
codice:
class ComponenteBase {
public:
friend std::ostream& operator<<(std::ostream& os, const ComponenteBase & comp) {
// qui si ha accesso a ogni dato privato.
os << comp.get_internal_data();
return os;
}
friend std::istream& operator>>(std::istream& os, ComponenteBase & comp) {
// qui si ha accesso a ogni dato privato.
}
private:
virtual double& get_internal_data();
};
Una spiegazione più dettagliata (in inglese) la trovi a:
http://www.parashift.com/c++-faq-lite/input-output.html
[15.8] e seguenti