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: 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: class CPlatform { public: CPlatform() { } 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 ) { } 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? |
|
Sparrow-hawk |
» 2012-07-31 18:56:27 Bo to powinno wyglądać przynajmniej tak: 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? |
|
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: CDynamicPlatform( float xx, float yy, float ww, float wwO, int fflags ) : x( xx ) , y( yy ) , w( ww ) , wO( wwO ) , flags( fflags ) { }
|
|
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: 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... |
|
« 1 » |