R0ut4 Temat założony przez niniejszego użytkownika |
[SFML] Dzielenie kodu na pliki i klasa » 2020-03-25 15:57:22 Witam, podzieliłem kod na trzy pliki. Main.cpp, gracz.hpp i gracz.cpp jednak po ustaleniu klasy i stworzeniu obiektu tej klasy wysakuje błąd: Error: aggregate 'Gracz player' has inclomplete type and cannot be defined. Main.cpp #include <SFML/Window.hpp> #include <SFML/Graphics.hpp> #include "gracz.hpp" #include "sterowanie.hpp"
enum Stan { Menu, Gra, Esc };
int main() { sf::RenderWindow aplikacja( sf::VideoMode( 840, 720 ), "Ogrod" ); aplikacja.setFramerateLimit( 60 ); Stan stan = Menu; Gracz player; sf::Texture tekstura_menu; tekstura_menu.loadFromFile( "Menu.png" ); sf::Texture tekstura_start; tekstura_start.loadFromFile( "przycisk_start.png" ); sf::Sprite tlo_menu; tlo_menu.setTexture( tekstura_menu ); sf::Sprite sp_start; sp_start.setTexture( tekstura_start ); while( aplikacja.isOpen() ) { sf::Event event; while( aplikacja.pollEvent( event ) ) { if( event.type == sf::Event::Closed ) { aplikacja.close(); } } switch( stan ) { case Menu: break; case Gra: break; case Esc: break; } aplikacja.clear(); switch( stan ) { case Menu: aplikacja.draw( tlo_menu ); aplikacja.draw( sp_start ); break; case Gra: break; case Esc: break; } aplikacja.display(); } return 0; }
gracz.hpp #ifndef gracz_hpp #define gracz_hpp class Gracz; #endif
gracz.cpp #include <SFML/Graphics.hpp> #include <SFML/Window.hpp> #include "gracz.hpp"
class Gracz : public sf::Drawable { private: virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const { sf::VertexArray P( sf::Quads, 4 ); sf::Texture textura; textura.loadFromFile( "gracz.png" ); P[ 0 ].texCoords = sf::Vector2f( 13, 0 ); P[ 1 ].texCoords = sf::Vector2f( 38, 0 ); P[ 2 ].texCoords = sf::Vector2f( 38, 50 ); P[ 3 ].texCoords = sf::Vector2f( 13, 50 ); states.texture = & textura; target.draw( P, states ); } };
|
|
pekfos |
» 2020-03-25 17:43:53 Definicja klasy musi być w pliku nagłówkowym. |
|
R0ut4 Temat założony przez niniejszego użytkownika |
» 2020-03-25 17:49:22 #ifndef gracz_hpp #define gracz_hpp class Gracz { virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const; }; #endif
Błąd: redefinition of 'class Gracz' Błąd: previous definition of 'class Gracz' |
|
pekfos |
» 2020-03-25 17:52:27 Metody, "Do definiowania metody poza definicją klasy..." |
|
R0ut4 Temat założony przez niniejszego użytkownika |
» 2020-03-25 18:07:53 #ifndef gracz_hpp #define gracz_hpp virtual void Gracz::draw( sf::RenderTarget & target, sf::RenderStates states ) const; #endif
Jeśli o to chodzi o nie działa xd Poza tym to jest definicja metody, a nie klasy |
|
pekfos |
» 2020-03-25 18:49:48 Nie mówiłem, żebyś zmienił tą definicję klasy. Błąd: redefinition of 'class Gracz' |
..tylko tą drugą. |
|
R0ut4 Temat założony przez niniejszego użytkownika |
» 2020-03-25 19:43:42 Ale czemu mam definiować metodę poza klasą? To co wysłałeś, ten rozdział z metodami, to w czym ma mi pomóc? |
|
pekfos |
» 2020-03-25 19:52:36 Jeśli nie chcesz oddzielać interfejsu klasy od jej implementacji, to tego nie rób. Po prostu wrzuć wszystko co miałeś w cpp do hpp. Jeśli jednak chcesz, to tylko definicje metod się wstawia do pliku cpp: class Gracz : public sf::Drawable { private: virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const; };
void Gracz::draw( sf::RenderTarget & target, sf::RenderStates states ) const { sf::VertexArray P( sf::Quads, 4 ); sf::Texture textura; textura.loadFromFile( "gracz.png" ); P[ 0 ].texCoords = sf::Vector2f( 13, 0 ); P[ 1 ].texCoords = sf::Vector2f( 38, 0 ); P[ 2 ].texCoords = sf::Vector2f( 38, 50 ); P[ 3 ].texCoords = sf::Vector2f( 13, 50 ); states.texture = & textura; target.draw( P, states ); }
Tak to powinno być zrobione. Wtedy jeśli coś zmienisz w implementacji klasy, tylko plik z jej implementacją będzie musiał być skompilowany ponownie, a nie wszystkie pliki jakie słyszały o klasie Gracz. |
|
« 1 » 2 |