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

[SFML, C++] Problem z wskaźnikiem ?

Ostatnio zmodyfikowano 2018-05-01 23:27
Autor Wiadomość
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.

C/C++
//Car.cpp (funckja bazowa)

class Car
    : public sf::Sprite
{
protected:
    sf::Texture * texture;
    sf::Sprite * sprite;
}

//CRed.cpp (dziedicząca z Car.cpp), nagłówkowego nie załączam, bo nie potrzeby

CRed::CRed( std::string filename, float x, float y )
{
    texture->loadFromFile( filename );
    sprite->setTexture( * texture );
    sprite->setPosition( x, y );
}

//main.cpp

Car * red = new CRed( "B_car_red.png", 50, 50 );
window.draw( * red );
P-170899
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"

C/C++
CRed::CRed( std::string filename, float x, float y )
{
    texture.loadFromFile( filename );
    sprite.setTexture( texture );
    sprite.setPosition( x, y );
    // i w Car.cpp też bez wskaźników
}

już nie ma wyjątków ani nic, ale nie pokazuje mi się objekt tak jakby gdziś zaginął w pamięci.
P-170900
pekfos
» 2018-05-01 22:59:50
Zaalokowałeś pamięć na te sprajty i tekstury?
P-170901
garlonicon
» 2018-05-01 23:00:03
C/C++
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.
P-170902
pekfos
» 2018-05-01 23:02:58
C/C++
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?
P-170903
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ć ?
P-170904
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.
P-170905
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ć.
P-170906
« 1 »
  Strona 1 z 1