Monika90 |
» 2014-06-20 20:30:12 Najlepiej, pokaż jak wygląda Twoja hierarchia klas. Czy nie wystarczy coś takiego? if( auto item = dynamic_cast < ItemBuff *>( m_slots[ spell ] ) ) { } else if( auto item = dynamic_cast < ItemAmmoWizardBasic *>( m_slots[ spell ] ) ) { } else if( ) { } else { }
|
|
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 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 |
|
maly |
» 2014-06-21 10:43:34 Możliwe że nie na temat ale... 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. |
|
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 |
|
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. |
|
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. |
|
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? |
|
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. |
|
1 « 2 » |