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

[C++] typeinfo / typeid nie działa poprawnie

Ostatnio zmodyfikowano 2014-06-21 21:26
Autor Wiadomość
Monika90
» 2014-06-20 20:30:12
Najlepiej, pokaż jak wygląda Twoja hierarchia klas.

Czy nie wystarczy coś takiego?
C/C++
if( auto item = dynamic_cast < ItemBuff *>( m_slots[ spell ] ) )
{
    //tutaj item to wsk. do ItemBuff
}
else if( auto item = dynamic_cast < ItemAmmoWizardBasic *>( m_slots[ spell ] ) )
{
    //tutaj item to wsk. do ItemAmmoWizardBasic
}
else if( /*i tak dalej*/ )
{
}
else
{
    //Nie wiadomo co
}
P-112404
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-21 10:01:42
Monika, twoje rozwiązanie kazałoby mi dla kazdego Itemu robić osobnego ifa. Itemów narazie jest mało ale przybędzie wiec nie ma to sensu. Zresztą itemy pochodne ItemBuff mają dokładnie takie samo wykonanie dlatego wystarczy if dla klasy ItemBuff, jednak najpierw musze rozpoznać czy z pochodną tej właśnie klasy mam doczyniania

DejaVu użyłem tego twojego alternative, od razu przechodzi warunki rozpoznania jednak dalej sie program wysypuje, tzn
C/C++
void Player::UseItem( Vector2i & mouse )
{
    if( m_slots[ spell ] != NULL )
    {
        if( m_slots[ spell ]->CanUse() )
        {
            if( m_slots[ spell ]->isItItemBuff() != NULL )
            {
               
            }
            else if( m_slots[ spell ]->isItItemAmmo() != NULL )
            {
                if( m_AllowToAttack )
                {
                    float a =( mouse.x ) -( m_positionX + 16 );
                    float b =( mouse.y ) -( m_positionY + 32 );
                   
                    float angle =( atan2( a, b ) * 180 / PI ) * - 1;
                   
                    ItemAmmo * tmp_ammo = dynamic_cast < ItemAmmo *>( m_slots[ spell ] );
                   
                    Ammo * skill = tmp_ammo->GetAmmo();
                   
                    cout << skill->manause << endl;
                   
                    if( m_sp >= skill->manause )
                    {
                        m_sp -= skill->manause;
                        m_attack = skill->damage;
                       
                        skill->sprite.setPosition( m_positionX + GetSize().x / 2, m_positionY + GetSize().y / 2 );
                       
                        Ammos.push_back( skill );
                       
                        m_AllowToAttack = false;
                    }
                    else delete skill;
                   
                }
            }
        }
    }
}
przy cout<<skill->manause; zamiast 40 pokazuje 0 , a potem program sie crashuje. Sprawdziłem po kolei cout'ami na której linijce, jednak w tej funkcji na żadnej, wnioskuje więc ze jest to przez to, że tu
Ammos.push_back( skill );
 dodaje cos, a dalej próbując na tym działać sie sypie (w pętli głównej obsługującej mechanike jednkostek na mapie (tzn strzał, czy w tym przypadku, czarów), chociaż sprawdzając typeid, jest tam poprawny typ/obiekt
P-112436
maly
» 2014-06-21 10:43:34
Możliwe że nie na temat ale...
C/C++
Ammo * skill = tmp_ammo->GetAmmo();
Ammos.push_back( skill );
delete skill;
Kombinacja tych trzech lini jest conajmniej dziwna.
Jesteś pewien że Ammos zawsze posiada prawidłowy wskaźnik do skill, chodzi mi oto że ni z gruchy ni z pietruchy używasz delete skill.
Druga dziwność to czemu usuwasz skill poza właściwą klasą(ItemAmmo) która jest właścicielem owego skill-a.
P-112437
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-21 10:48:44
sory, niezauważyłem ale to delete usunąłem juz wcześniej
P-112438
DejaVu
» 2014-06-21 13:17:05
Skupmy się na problemie z tematu, a nie na problemie wynikającym ze złego kodowania. Wykomentuj cały kod wewnątrz warunków i wypisuj po prostu na konsolę w który warunek weszło. Później wywołaj jakąś metodę, ale na pewno nie kasuj żadnych obiektów i nie zmieniaj liczby obiektów w kontenerach.

Trzymaj się zasady jeden temat = jeden problem, bo temat na chwilę obecną jeszcze jest użyteczny dla innych potencjalnych czytelników, a wkrótce może się z tego zrobić 'papka' jak rozmowa pójdzie w innym kierunku.
P-112448
Monika90
» 2014-06-21 13:23:25
Monika, twoje rozwiązanie kazałoby mi dla kazdego Itemu robić osobnego ifa. Itemów narazie jest mało ale przybędzie wiec nie ma to sensu.
Problemy z dodawaniem nowych klas do systemu są typowe w przypadku używania RTTI (czyli sprawdzania typów w czasie wykonania za pomocą typid, dynamic_cast, itp), dlatego odradza się używania RTTI. Najlepiej używać operacji polimorficznych, czyli f. wirtualnych. W przypadku gdy wybór operacji w czasie wykonania zależy od więcej niż jedengo typu, można użyć technik takich jak Double Dispatch, albo Visitor. Ale tego też lepiej unikać, bo to skomplikowane.
P-112451
colorgreen19
Temat założony przez niniejszego użytkownika
» 2014-06-21 20:41:06
e1/ @Monika90 no ale w tym wypadku ja niemoge mieć virtualnych, i niestety bardzo nad tym ubolewam

Zauważyłem duzy błąd który prawie zupełnie zmienia tego koncepcje. Otóż ja nie moge wykorzystać tego m_ammo czy m_buff (wewnętrzne wskaźniki na obiekty w klasach ItemAmmo, ItemBuff) tylko musze pobrać jego typ, aby na tej podstawie utworzyć w pamięci nowy obiekt tego. A tu już nie mam zbytnio pojęcia jak to zrobić. Konstruktorem kopiującym? czy zwykłe "=" wystarczy?
P-112477
DejaVu
» 2014-06-21 21:26:23
Załóż osobny temat jeżeli nie dotyczy on typeinfo/typeid - ten problem z mojego punktu został dawno rozwiązany.
P-112479
1 « 2 »
Poprzednia strona Strona 2 z 2