Mam pytanie odnośnie linijek :
cout << a1 << " " << a1.srednia() << endl ;
cout << a2 << " " << a2.srednia() << endl;
cout << a13 << " " << a13.srednia() << endl;
a1 jest obiektem klasy analiza natomiast jestem w stanie wyrzucić to na ekran dlatego ze mam przeładowany operator wyjścia w klasie pomiar
ostream& operator << (ostream& out,const pomiar& ob)
{
return out << ob.opis;
}
Moje pytanie to dlaczego to nie ma byc zdefiniowany wewnatrz klasy analiza operator wyjscia ? (Przeciez a1 jest obiektem klasy analiza a nie pomiar jedynie po niej dziedziczy publicznie ale to wciąż inny typ ) Dlaczego kompilator wie jak się zachować w tym przypadku ?
Fragment kodu;
#include <iostream>
using namespace std;
class pomiar{
protected:
string opis;
unsigned roz;
double* tab;
public:
pomiar():opis("0"),roz(0),tab(new double){}
pomiar(const string& a1,const unsigned a2)
:opis(a1),roz(a2),tab(roz? new double(roz):0)
{
for(int i = 0 ; i < roz ;i++){
tab[i]=0;
}
}
pomiar(const string& a1,const double*pocz,const double*kon)
:opis(a1),roz(kon-pocz),tab(roz? new double[roz]:0)
{
for(int i = 0 ; i < roz ; ++i)
{
tab[i]=pocz[i];
}
}
friend ostream& operator << (ostream& out,const pomiar& ob);
};
ostream& operator << (ostream& out,const pomiar& ob)
{
return out << ob.opis;
}
class analiza:public pomiar{
public:
analiza(){}
analiza(const string& a1,const double *p,const double *k)
:pomiar(a1,p,k){}
double srednia()const throw (string)
{
if(roz==0)throw string ("Nie mozna dzielic przez 0");
double suma = 0;
for(int i = 0 ; i < roz ; i++)
{
suma +=tab[i];
}
return suma/roz;
}
};
int main()
{
double dane1[] = { 1.1, 2.2, 3.3, 4.4, 5.5, 6.6, 7.7, 8.8, 9.9 };
double dane2[] = { 6.2, 5.0, 3.8, 5.4, 4.6, 6.0, 4.0, 7.5, 2.5 };
double dane3[] = { 0, 4, 0, 4, 0, 4 };
analiza a1("Wysokosc trawy [ cm ] ", dane1, dane1+9);
analiza a2("Moc czynna generatora [ MW ] ", dane2, dane2+9);
analiza a13("test", dane3, dane3+6);
cout << a1 << " " << a1.srednia() << endl ;
cout << a2 << " " << a2.srednia() << endl;
cout << a13 << " " << a13.srednia() << endl;
}