Alky Temat założony przez niniejszego użytkownika |
[SFML, C++] Problem z wskaźnikiem ? » 2018-05-01 22:51:37 Witam, ktoś jest w stanie mi wyjaśnić dlaczego poniższy kod sprawia, że program się kompuluje, ale zacina i wypluwa wyjątek? Domyślam się, że coś schrzaniłem z wskaźnikami. Załączam tylko te kawałki które coś wnoszą do tego problemu.
class Car : public sf::Sprite { protected: sf::Texture * texture; sf::Sprite * sprite; }
CRed::CRed( std::string filename, float x, float y ) { texture->loadFromFile( filename ); sprite->setTexture( * texture ); sprite->setPosition( x, y ); }
Car * red = new CRed( "B_car_red.png", 50, 50 ); window.draw( * red );
|
|
Alky Temat założony przez niniejszego użytkownika |
» 2018-05-01 22:59:36 Na dobra sprawę nie jestem pewien, czy te wskaźniki sąw tym przypadku w ogóle potrzebne, bo tak naprawdę ten wszsytko to robię w konstruktorze i potem chyba już nie potrzebuję tych wartości, ale po zmianie kodu na "bezwskaźnikowy" CRed::CRed( std::string filename, float x, float y ) { texture.loadFromFile( filename ); sprite.setTexture( texture ); sprite.setPosition( x, y ); }
już nie ma wyjątków ani nic, ale nie pokazuje mi się objekt tak jakby gdziś zaginął w pamięci. |
|
pekfos |
» 2018-05-01 22:59:50 Zaalokowałeś pamięć na te sprajty i tekstury? |
|
garlonicon |
» 2018-05-01 23:00:03 texture->loadFromFile( filename ); sprite->setTexture( * texture ); sprite->setPosition( x, y ); |
Dlaczego w konstruktorze używasz wskaźników wskazujących na przypadkowe adresy? Bo skoro nie przypisujesz im nigdzie żadnej wartości, to wskazują gdziekolwiek, czyli zachowanie jest niezdefiniowane. |
|
pekfos |
» 2018-05-01 23:02:58 Car * red = new CRed( "B_car_red.png", 50, 50 ); window.draw( * red ); |
Bo tak tego nie wyświetlisz. Niby dlaczego miałoby to wyświetlić tego sprajta, którego sobie zdefiniowałeś w klasie? |
|
Alky Temat założony przez niniejszego użytkownika |
» 2018-05-01 23:09:56 Pekfos, mógłbyś wyjaśnić ostatnią wiadomość? Dlaczego nie powinna wyświetlić ? |
|
pekfos |
» 2018-05-01 23:17:52 Twoja klasa ma sprajta i jest sprajtem. Ty ustawiasz własności tego pierwszego, a wyświetlane jest to drugie. Kłaniają się podstawy programowania obiektowego. Albo wywal niepotrzebnego składowego sprajta, albo dziedzicz po sf::Drawable i zdefiniuj operację rysowania, by rysowała składowego sprajta. Dlaczego nie powinna wyświetlić ? |
To nie powinno wymagać żadnych wyjaśnień. Masz sprajta, sprajt ma nazwę. Nazwa nie jest nigdzie użyta do wyświetlenia go. Dlaczego niby miałoby się wyświetlić? Samo to się komputer wyłącza, jak za prąd nie zapłacisz. |
|
Alky Temat założony przez niniejszego użytkownika |
» 2018-05-01 23:27:17 Dzięki, rzeczywiście :/ Zaraz postaram się coś z tym zrobić. |
|
« 1 » |