Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Pokazywanie wskaźnikiem na obiekty klasy pochodnej

Ostatnio zmodyfikowano 2013-07-03 17:10
Autor Wiadomość
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:

C/C++
class Equipment
{
    Item * tab[ maxItems ];
    int currently;
public:
    Equipment();
    void dropItem( short );
    void addItem( Item * );
    void showEquipment();
};

oraz metodę showEquipment():

C/C++
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:

C/C++
Equipment ekw;
Weapon mojaBron( "Nazwa", 0, "Opis", 90, 2 );
ekw.showEquipment();
// Chce by wlasnie przy wywolaniu funkcji show..., ruszał do pracy operator<< klasy Weapon, nie klasy Item.
P-86435
pekfos
» 2013-06-28 13:42:27
Tak tego nie zrobisz. Utwórz metodę wirtualną do wypisywania do strumienia.
P-86437
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:

C/C++
#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:

C/C++
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ć.
P-86443
unimator
» 2013-06-29 11:08:24
Nie prościej byłoby zrobić takie coś:
C/C++
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ś.
P-86551
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.
P-86906
« 1 »
  Strona 1 z 1