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

Problem z kolejnością definiowania klas.

Ostatnio zmodyfikowano 2015-12-26 14:30
Autor Wiadomość
costam
Temat założony przez niniejszego użytkownika
Problem z kolejnością definiowania klas.
» 2015-12-24 11:51:39
C/C++
namespace Figury
{
    enum Rodzaje
    {
        Prostokat,
        Kolo
    };
}
class Figura;
class Prostokat;
class Kolo;

class SzablonFigura
{
public:
    virtual Figury::Rodzaje GetRodzaj() = 0;
    virtual bool KolizjaProstokat( Prostokat & p ) = 0;
    virtual bool KolizjaKolo( Kolo & k ) = 0;
   
};
class Figura
{
    SzablonFigura * figura;
public:
    virtual Vector2f GetPoz() = 0;
    virtual sf::FloatRect GetDane() = 0;
    void TworzKolo( int promien )
    {
        figura = new Kolo( promien, { GetPoz().x / 2, GetPoz().y / 2 } );
    }
    void TworzProstokat()
    {
        figura = new Prostokat( GetDane() );
    }
    bool Kolizja( Figura & f )
    {
        if( f.figura->GetRodzaj() == Figury::Rodzaje::Prostokat )
        {
            figura->KolizjaProstokat( * dynamic_cast < Prostokat *>( f.figura ) );
        }
    }
};
class Prostokat
    : public SzablonFigura
{
    bool KolizjaProstokat( Prostokat & p ) override
    {
        return dane.intersects( p.dane );
    }
    bool KolizjaKolo( Kolo & k ) override
    {
        float x0 = k.srodek.x;
        float y0 = k.srodek.y;
        float x1 = dane.left;
        float y1 = dane.top;
        float x2 = dane.left + dane.width;
        float y2 = dane.top + dane.height;
        float n = fabs(( x2 - x1 ) *( y1 - y0 ) -( x1 - x0 ) *( y2 - y1 ) );
        float d = sqrt(( x2 - x1 ) *( x2 - x1 ) +( y2 - y1 ) *( y2 - y1 ) );
        float dist = n / d;
        if( dist > k.promien ) return false;
       
        float d1 = sqrt(( x0 - x1 ) *( x0 - x1 ) +( y0 - y1 ) *( y0 - y1 ) );
        if(( d1 - k.promien ) > d ) return false;
       
        float d2 = sqrt(( x0 - x2 ) *( x0 - x2 ) +( y0 - y2 ) *( y0 - y2 ) );
        if(( d2 - k.promien ) > d ) return false;
       
        return true;
    }
   
public:
    sf::FloatRect dane;
    Prostokat( sf::FloatRect & dane )
    {
        this->dane = dane;
    }
    Figury::Rodzaje GetRodzaj() override
    {
        return Figury::Rodzaje::Prostokat;
    }
};
class Kolo
    : public SzablonFigura
{
    bool KolizjaProstokat( Prostokat & p ) override
    {
        float x0 = srodek.x;
        float y0 = srodek.y;
        float x1 = p.dane.left;
        float y1 = p.dane.top;
        float x2 = p.dane.left + p.dane.width;
        float y2 = p.dane.top + p.dane.height;
        float n = fabs(( x2 - x1 ) *( y1 - y0 ) -( x1 - x0 ) *( y2 - y1 ) );
        float d = sqrt(( x2 - x1 ) *( x2 - x1 ) +( y2 - y1 ) *( y2 - y1 ) );
        float dist = n / d;
        if( dist > promien ) return false;
       
        float d1 = sqrt(( x0 - x1 ) *( x0 - x1 ) +( y0 - y1 ) *( y0 - y1 ) );
        if(( d1 - promien ) > d ) return false;
       
        float d2 = sqrt(( x0 - x2 ) *( x0 - x2 ) +( y0 - y2 ) *( y0 - y2 ) );
        if(( d2 - promien ) > d ) return false;
       
        return true;
    }
    bool KolizjaKolo( Kolo & k ) override
    {
        float odlegloscSrodkow = sqrt( pow( k.srodek.x - srodek.x, 2 ) * pow( k.srodek.x - srodek.x, 2 ) );
        return odlegloscSrodkow <= promien + k.promien;
    }
public:
    int promien;
    Vector2f srodek;
   
    Kolo( int promien, Vector2f srodek )
    {
        this->promien = promien;
        this->srodek = srodek;
    }
    Figury::Rodzaje GetRodzaj() override
    {
        return Figury::Rodzaje::Kolo;
    }
   
};

Kompilator pisze błąd że klasa Kolo jest niezdefiniowana a gdy Kolo i Prostokąt zamienie miejscami tj. kolo jest przed prostokątem to pisze że Prostokat jest niezdefiniowany.
P-142299
j23
» 2015-12-24 15:18:55
Błąd masz, ponieważ używasz klasy Kolo (w Figura::TworzKolo) przed jej zdefiniowaniem. Deklaracja zapowiadająca nie daje kompilatorowi wszystkich niezbędnych informacji, jedynie informuje, że jest gdzieś tam jakaś klasa Kolo. Dlatego możesz stworzyć jedynie wskaźnik lub referencję, ale nie sam obiekt. Rozwiązanie jest proste: przenieś wszystkie metody odwołujące się do obiektów klasy Kolo za definicje tej klasy lub zrób klasyczny podział na nagłówek i plik źródłowy (z implementacjami metod).
P-142310
costam
Temat założony przez niniejszego użytkownika
» 2015-12-26 14:30:05
Więc mówisz że gdybym przeniósł klasę Figura w której są funkcje Twórz na sam dół to będzie dobrze? Przeniosłem i się nadal nie kompiluje. Mógłby ktoś ten kod poprawić
Ps nie piszcie mi że mam złą kolizję koła z prostokątem wiem o tym.
P-142376
« 1 »
  Strona 1 z 1