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

[SFML] Dzielenie kodu na pliki i klasa

Ostatnio zmodyfikowano 2020-03-25 22:28
Autor Wiadomość
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
C/C++
#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 )
        {
            //OBSlUGA ZDARZEN W MENU
        case Menu:
           
            break;
            //OBSLUGA ZDARZEN W GRZE
        case Gra:
           
            break;
            //OBSLUGA ZDARZEN W ESC
        case Esc:
           
            break;
        }
       
        aplikacja.clear();
        switch( stan )
        {
            //WYSWIETLANIE ZDARZEN W MENU
        case Menu:
            aplikacja.draw( tlo_menu );
            aplikacja.draw( sp_start );
            break;
            //WYSWIETLANIE ZDARZEN W GRZE
        case Gra:
           
            break;
            //WYSWIETLANIE ZDARZEN W ESC
        case Esc:
           
            break;
        }
        aplikacja.display();
    }
    return 0;
}

gracz.hpp
C/C++
#ifndef gracz_hpp
#define gracz_hpp
class Gracz;
#endif // gracz_hpp

gracz.cpp
C/C++
#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 );
    }
};
P-176485
pekfos
» 2020-03-25 17:43:53
Definicja klasy musi być w pliku nagłówkowym.
P-176487
R0ut4
Temat założony przez niniejszego użytkownika
» 2020-03-25 17:49:22
C/C++
#ifndef gracz_hpp
#define gracz_hpp
class Gracz
{
    virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const;
};
#endif // gracz_hpp
Błąd: redefinition of 'class Gracz'
Błąd: previous definition of 'class Gracz'
P-176488
pekfos
» 2020-03-25 17:52:27
» Programowanie obiektowe, C++ » PodstawyMetody lekcja, "Do definiowania metody poza definicją klasy..."
P-176490
R0ut4
Temat założony przez niniejszego użytkownika
» 2020-03-25 18:07:53
C/C++
#ifndef gracz_hpp
#define gracz_hpp
virtual void Gracz::draw( sf::RenderTarget & target, sf::RenderStates states ) const;
#endif // gracz_hpp

Jeśli o to chodzi o nie działa xd

Poza tym to jest definicja metody, a nie klasy
P-176493
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ą.
P-176495
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?
P-176498
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:
C/C++
/// HPP:
class Gracz
    : public sf::Drawable
{
private:
    virtual void draw( sf::RenderTarget & target, sf::RenderStates states ) const;
};


/// CPP:
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.
P-176499
« 1 » 2
  Strona 1 z 2 Następna strona