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

Problem z dziedziczeniem

Ostatnio zmodyfikowano 2012-08-01 10:51
Autor Wiadomość
graszka
Temat założony przez niniejszego użytkownika
Problem z dziedziczeniem
» 2012-07-31 17:35:50
Witam! Mam problem z z tymi dwiema klasami:
C/C++
class CPlatform
{
public:
    CPlatform( float x, float y, float w, float wO, int flags )
        : x( x )
        , y( y )
        , w( w )
        , wO( wO )
        , flags( flags )
    { }
    float x, y, w, wO;
    int flags;
};

class CDynamicPlatform
    : public CPlatform
{
public:
    CDynamicPlatform( float x, float y, float w, float wO, int flags )
        : x( x )
        , y( y )
        , w( w )
        , wO( wO )
        , flags( flags )
        , move( 0 )
    { }
    int move;
};
Po próbie kompilacji kompilator wypluwa:
In constructor ‘CDynamicPlatform::CDynamicPlatform(float, float, float, float, int)’:
error: class ‘CDynamicPlatform’ does not have any field named ‘x’
error: class ‘CDynamicPlatform’ does not have any field named ‘y’
error: class ‘CDynamicPlatform’ does not have any field named ‘w’
error: class ‘CDynamicPlatform’ does not have any field named ‘wO’
error: class ‘CDynamicPlatform’ does not have any field named ‘flags’
error: no matching function for call to ‘CPlatform::CPlatform()’
note: candidates are:
note: CPlatform::CPlatform(float, float, float, float, int)
note:   candidate expects 5 arguments, 0 provided
note: CPlatform::CPlatform(const CPlatform&)
note:   candidate expects 1 argument, 0 provided

Rozumiem, że przy wywołaniu konstruktora CDynamicPlatform wywołuje się konstruktor CPlatform(), który może zainicjować zmienne x, y itd. Jak przerobię kod tak:
C/C++
class CPlatform
{
public:
    CPlatform() { } //Tu dodałam ten konstruktor
    CPlatform( float x, float y, float w, float wO, int flags )
        : x( x )
        , y( y )
        , w( w )
        , wO( wO )
        , flags( flags )
    { }
    float x, y, w, wO;
    int flags;
};

class CDynamicPlatform
    : public CPlatform
{
public:
    CDynamicPlatform( float x, float y, float w, float wO, int flags )
        : move( 0 )
    { } //a tu już nie inicjuję x, y, w, wO, flags
    int move;
};
to kod się kompiluje, ale nie inicjuje zmiennych (bo niby jak, jeśli nie podaję mu jakimi wartościami ma zainicjować). Więc moje pytanie brzmi: co mam zrobić, żeby zainicjować zmienne x, y, w itd. w kostruktorze CDynamicPlatform podanymi przeze mnie wartościami?
P-61506
Sparrow-hawk
» 2012-07-31 18:56:27
Bo to powinno wyglądać przynajmniej tak:
C/C++
class CPlatform
{
public:
    CPlatform( float x, float y, float w, float w0, int flags )
        : x( x )
        , y( y )
        , w( w )
        , w0( w0 )
        , flags( flags )
    { }
    float x, y, w, w0;
    int flags;
};

class CDynamicPlatform
    : public CPlatform
{
public:
    CDynamicPlatform( float x, float y, float w, float w0, int flags, int move )
        : CPlatform( x, y, w, w0, flags )
        , move( move )
    { }
    int move;
};

Po za tym, gdzie masz destruktory?
P-61519
kubawal
» 2012-07-31 20:26:37
skąd konstruktor klasy CDynamicPlatform ma wiedzieć czy chodzi o x podawane w argumencie, czy składową o tej samej nazwie?


Tak to zrób:

C/C++
CDynamicPlatform( float xx, float yy, float ww, float wwO, int fflags )
    : x( xx )
    , y( yy )
    , w( ww )
    , wO( wwO )
    , flags( fflags )
{ }
P-61528
graszka
Temat założony przez niniejszego użytkownika
» 2012-08-01 10:51:22
Dzięki, Sparrow-hawk, już działa. Co do tych destruktorów to nie napisałam ich, bo w klasach nie ma żadnych wskaźników, więc nie trzeba. A nawet jakby było trzeba to zrobiłabym tak:
C/C++
class CPlatform
{
public:
    CPlatform( float x, float y, float w, float wO, int flags )
        : x( x )
        , y( y )
        , w( w )
        , wO( wO )
        , flags( flags )
    { }
    virtual ~CPlatform() { printf( "Dekonstruktor CPlatform wywolany! \n" ); }
    float x, y, w, wO;
    int flags;
};

class CDynamicPlatform
    : public CPlatform
{
public:
    CDynamicPlatform( float x, float y, float w, float w0, int flags )
        : CPlatform( x, y, w, w0, flags )
        , move( 0 )
    { }
    ~CDynamicPlatform() { printf( "Dekonstruktor CDynamicPlatform wywolany!\n" ); }
    int move;
};
i działa.
@kubawal na liście inicjacyjnej chyba wiadomo, że to co jest przed nawiasem jest składową klasy, a to co w nawiasie wartością, którą jej przypisujemy. Inaczej byłoby trochę bez sensu przypisywać jakąś wartość argumentowi...
P-61565
« 1 »
  Strona 1 z 1