Problem z polimorfizmem

Problem z polimorfizmem
CH
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
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ę:

Kopiuj
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ę :)

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
2
Kopiuj
class dane
  {
   public:
   virtual ostream &prn(ostream &s)const;
  };
ostream &operator<<(ostream &s,const dane &d) { return d.prn(s); }

Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
CH
  • Rejestracja:około 14 lat
  • Ostatnio:ponad 12 lat
  • Postów:22
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ć?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
0

Nie musi:

Kopiuj
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.
edytowany 1x, ostatnio: _13th_Dragon
0
_13th_Dragon napisał(a):

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

?

_13th_Dragon
  • Rejestracja:ponad 19 lat
  • Ostatnio:3 miesiące
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.


Wykonuję programy na zamówienie, pisać na Priv.
Asm/C/C++/Pascal/Delphi/Java/C#/PHP/JS oraz inne języki.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.