Problem z polimorfizmem

0

Witam, mam następujący problem:
Mam klasę wektor (dynamiczna tablica zrobiona na szablonach), klasę dane, oraz klasy dziedziczące po klasie dane: student, pracownik i doktorant.
Mam do wektora wczytać z pliku dane o osobach, więc to robię:

fstream plik("dane.txt");
wektor<dane*> tab;
dane* w;
string buf;

while(!plik.eof())
{
	plik >> buf;
	if(buf == "dane") w = new dane;
	else if(buf == "pracownik") w = new pracownik;
	else if(buf == "student") w = new student;
	else if(buf == "doktorant") w = new doktorant;

	(*w).read(plik);
	tab.insert(w);
} 

Wiadomo, że inaczej wczytujemy studenta, inaczej same dane, więc metoda read() jest wirtualna. I dalej chcę wyświetlić wczytane dane. I tu jest problem, skoro w to wskaźnik na dane, nie wiem jak to zrobić. Przeciążony operator << nie może być wirtualny, bo przecież musi być poza klasą, a do metod typu getCośtam nie mogę się dostać, bo przecież klasa dane nie ma metod zwracających np. rok studiów.

Jakiś pomysł na rozwiązanie problemu? Nie wstawiam kodu klas, bo wszystko w nich działa jak należy i wydaje mi się to zbędne w tej sytuacji, a nie chce zaśmiecać wątku. Ale jak będzie trzeba to wrzucę :)

2
class dane
  {
   public:
   virtual ostream &prn(ostream &s)const;
  };
ostream &operator<<(ostream &s,const dane &d) { return d.prn(s); }
0

Super, dzięki wszystko działa :)
Tylko mam pytanie odnośnie słowa const. Z tego co widze jest kluczowe, bo bez niego nie działa.

Jak wyczytałem, oznacza to że funkcja nie może zmienić stanu obiektu. I nic mi to nie mówi.. Dlaczego tak musi być?

0

Nie musi:

class dane
  {
   public:
   virtual ostream &prn(ostream &s);
  };
ostream &operator<<(ostream &s,dane &d) { return d.prn(s); }

Ale rozsądniej z const aby to kompilator pilnował żebym zapomniawszy obiektu nie zmieniłem.

0
_13th_Dragon napisał(a):

Ale rozsądniej z const aby to kompilator pilnował żebym zapomniawszy obiektu nie zmieniłem.

?

0

Dobra rada:

  1. Jak funkcja ma nie zmieniać przekazanego przez referencje obiektu to dodawaj const. np: ostream &operator<<(ostream &s,const dane &d)
  2. Jak metoda ma nie zmieniać żadnej składowej klasy dodawaj const. np: virtual ostream &prn(ostream &s)const;

Przy pisaniu zwłaszcza większych projektów bardzo pomaga w niepopełnieniu błędu nieświadomie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1