Pokazywanie wskaźnikiem na obiekty klasy pochodnej
Ostatnio zmodyfikowano 2013-07-03 17:10
kubek3898 Temat założony przez niniejszego użytkownika |
Pokazywanie wskaźnikiem na obiekty klasy pochodnej » 2013-06-28 13:38:15 Witam, przejdę od razu do rzeczy. Mam klasę Equipment: class Equipment { Item * tab[ maxItems ]; int currently; public: Equipment(); void dropItem( short ); void addItem( Item * ); void showEquipment(); }; oraz metodę showEquipment(): void Equipment::showEquipment() { cout << "W ekwipunku jest:" << endl; for( short s = 0; s < maxItems; s++ ) { if( tab[ s ] ) cout << s + 1 << ". " << endl << * tab[ s ] << endl; } } Mam też klasę Weapon, która dziedziczy od klasy Item (ma inną wersję operatora<<) Otóż mój problem polega na tym, że przy tworzenie wskaźnika do pokazywania na obiekty typu Item (Item * tab), metoda showEquipment() pokazuje tylko na obiekty typu Item. Tak to logiczne, jednak ja chcę by pokazywało również na klasy pochodne od klasy Item. Czyli jeśli obiektem jest Item, niech wywołuje operator<< dla klasy Item, jeśli Weapon - operator<< dla klasy Weapon. Wiem, że służą do tego funkcje wirtualne, ale albo ja źle je tworzę, albo muszę po prostu zrobić coś innego. Wytłumaczę to jeszcze bardziej obrazowo: Equipment ekw; Weapon mojaBron( "Nazwa", 0, "Opis", 90, 2 ); ekw.showEquipment();
|
|
pekfos |
» 2013-06-28 13:42:27 Tak tego nie zrobisz. Utwórz metodę wirtualną do wypisywania do strumienia. |
|
kubek3898 Temat założony przez niniejszego użytkownika |
» 2013-06-28 14:26:06 Zdefiniowałem sobie funkcję, która wywołuje się przy użyciu operatora: #include "item.h"
ostream & operator <<( ostream & stream, Item & i ) { i.stream( stream ); return stream; }
void Item::stream( ostream & stream ) { stream << "Nazwa przedmiotu: " << name << endl; stream << "Wartosc: " << value << endl; stream << "Opis: " << desc << endl; }
void Weapon::stream( ostream & stream ) { stream << "Nazwa przedmiotu: " << name << endl; stream << "Wartosc: " << value << endl; stream << "Opis: " << desc << endl; stream << "Obrazenia: " << damage << endl; stream << "Typ: " << typeWeapon << endl; }
Funkcja stream( ostream & ) jest wirtualna. Jednak, teraz wyrzuca ogrom błędów związanych właśnie z operatorem: error: no match for 'operator<<' in '(& std::operator<< <std::char_traits<char> >((* & std::cout.std::basic_ostream<_CharT, _Traits>::operator<< <char, std::char_traits<char> >((((int)s) + 1))), ((const char*)". ")))->std::basic_ostream<_CharT, _Traits>::operator<< <char, std::char_traits<char> >(std::endl<char, std::char_traits<char> >) << *((Equipment*)this)->Equipment::tab[((int)s)]'|
odpowiada za to funkcja: void Equipment::showEquipment() { cout << "W ekwipunku jest:" << endl; for( short s = 0; s < maxItems; s++ ) { if( tab[ s ] ) cout << s + 1 << ". " << endl << * tab[ s ] << endl; } } Domyślam się, że to przez wyświetlanie wskaźnika do pokazywania na obiekty typu Item, na ekranie, jednak nie wiem jak konkretnie to naprawić. |
|
unimator |
» 2013-06-29 11:08:24 Nie prościej byłoby zrobić takie coś: void Equipment::showEquipment() { cout << "W ekwipunku jest:" << endl; for( short s = 0; s < maxItems; s++ ) { if( tab[ s ] ) { tab[ s ]->showItem(); cout << endl; } } }
void Item::showItem() { cout << "Nazwa przedmiotu: " << name << endl; cout << "Wartosc: " << value << endl; cout << "Opis: " << desc << endl; }
void Weapon::showItem() { cout << "Nazwa przedmiotu: " << name << endl; cout << "Wartosc: " << value << endl; cout << "Opis: " << desc << endl; cout << "Obrazenia: " << damage << endl; cout << "Typ: " << typeWeapon << endl; }
Gdzie showItem byłoby funkcją wirtualną. Nie kompilowałem więc nie wiem czy działa jak coś. |
|
kubek3898 Temat założony przez niniejszego użytkownika |
» 2013-07-03 17:10:22 Przepraszam, że trochę późno, ale dopiero teraz miałem okazję to przetestować. unimator, dzięki za podrzucenie pomysłu, lecz wystarczyło tylko, przenieść definicję operatora<< do wnętrza klasy i dodać słowo kluczowe friend.
Problem rozwiązany, zamykam. |
|
« 1 » |