MrNyna77 Temat założony przez niniejszego użytkownika |
[C++] Dziedziczenie klasy abstakcyjnej » 2012-11-12 18:39:32 Witam. Posiadam klasę abstrakcyjną pocisk.h #ifndef POCISK_H #define POCISK_H #include "ludzik.h"
class pocisk { public: pocisk(); virtual void draw() = 0; virtual void update() = 0; virtual void fire( ludzik & man ) = 0; virtual void colide() = 0; ~pocisk(); };
#endif
na podstawie tej klasy próbuję utworzyć klasę #ifndef ZWYKLY_H #define ZWYKLY_H
#include "pocisk.h" #include "ludzik.h"
class zwykly : public pocisk { public: zwykly(); void draw(); void update(); void fire( ludzik & man ); void colide(); int x, y, speed; bool live; ~zwykly(); protected: private: };
#endif
Ale już przy próbie definicji konstruktora i destruktora Code::Block sygnalizuje błędy. zwykly.cpp #include "zwykly.h"
zwykly::zwykly() { }
zwykly::~zwykly() { } Zawartość schowka: obj\Debug\zwykly.o||In function `zwykly':| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|3|undefined reference to `pocisk::pocisk()'| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|3|undefined reference to `vtable for zwykly'| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|3|undefined reference to `pocisk::pocisk()'| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|3|undefined reference to `vtable for zwykly'| obj\Debug\zwykly.o||In function `~zwykly':| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|8|undefined reference to `vtable for zwykly'| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|11|undefined reference to `pocisk::~pocisk()'| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|8|undefined reference to `vtable for zwykly'| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|11|undefined reference to `pocisk::~pocisk()'| ||=== Build finished: 8 errors, 0 warnings ===| Ktoś mi może powiedzieć co robię źle? |
|
crash |
» 2012-11-12 19:24:17 undefined reference to `pocisk::pocisk() brakuje Ci w kodzie rozwinięcia metody pocisk::pocisk(). Masz w klasie takie metody, ale nie masz w kodzie ich rozwinięć (implementacji). |
|
MrNyna77 Temat założony przez niniejszego użytkownika |
» 2012-11-12 19:37:51 Dzięki za szybką odpowiedź. Po usunięcia konstruktora i destruktora z "pocisk.h" zawartość schowka prezentuje się następująco: obj\Debug\zwykly.o||In function `zwykly':| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|3|undefined reference to `vtable for zwykly'| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|3|undefined reference to `vtable for zwykly'| obj\Debug\zwykly.o||In function `~zwykly':| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|8|undefined reference to `vtable for zwykly'| C:\Documents and Settings\Helmud\Pulpit\cpp\pierwszy\zwykly.cpp|8|undefined reference to `vtable for zwykly'| ||=== Build finished: 4 errors, 0 warnings ===| Dalej nie wiem jak pozbyć się tych błędów... Pozdrawiam |
|
crash |
» 2012-11-12 19:48:41 Nie chodzi o usunięcie. Po to się deklaruje nagłówki metod w klasach: class JakasKlasa { public: JakasKlasa( typ param1, typ2 param2,...); ... };
żeby poza tymi klasami w odpowiednim miejscu kodu napisać ich rozwinięcia: ... JakasKlasa( typ param1, typ2 param2, itp...) { }
Kompilator pluje się o to, że masz deklarację metod wewnątrz klasy, ale nigdzie indziej w kodzie nie ma ich implementacji, czyli ciała tychże metod |
|
MrNyna77 Temat założony przez niniejszego użytkownika |
» 2012-11-12 21:09:55 Rozumiem, ale samo otwarcie i zamknięcie klamry powinno wystarczyć(mam tak w innym pliku). Wpisałem "zawartość" konstruktora: #include "zwykly.h"
zwykly::zwykly() { speed = 15; live = false; }
zwykly::~zwykly() { } A błędy są cały czas te same. W podobnym przypadku (tylko klasa bez dziedziczenia), ciało destruktora mam puste i się kompiluje bez problemu. Pozdrawiam |
|
DejaVu |
» 2012-11-12 21:16:21 Czy Twoja klasa 'pocisk' posiada implementację konstruktora i destruktora? PS. destruktor w klasie bazowej powinien być wirtualny. PSS. Mam wrażenie, że nie podajesz jakiejś istotnej informacji jaka jest zawarta w oryginalnym kodzie. PSSS. |
|
MrNyna77 Temat założony przez niniejszego użytkownika |
» 2012-11-12 21:24:27 Konstruktor i destruktor(wirtualny) klasy pocisk są puste(może kiedyś się przydadzą;)). #include "pocisk.h"
pocisk::pocisk() { } pocisk::~pocisk() { }
PS. Kod wszystkich plików: pocisk.h #ifndef POCISK_H #define POCISK_H #include "ludzik.h"
class pocisk { public: pocisk(); virtual void draw() = 0; virtual void update() = 0; virtual void fire( ludzik & man ) = 0; virtual void colide() = 0; virtual ~pocisk(); };
#endif
ludzik.cpp #include "pocisk.h"
pocisk::pocisk() { } pocisk::~pocisk() { }
zwykly.h #ifndef ZWYKLY_H #define ZWYKLY_H
#include "pocisk.h" #include "ludzik.h"
class zwykly : public pocisk { public: zwykly(); void draw(); void update(); void fire( ludzik & man ); void colide(); int x, y, speed; bool live; ~zwykly(); protected: private: };
#endif
zwykly.cpp #include "zwykly.h"
zwykly::zwykly() { speed = 15; live = false; }
zwykly::~zwykly() { }
|
|
DejaVu |
» 2012-11-12 21:44:12 void draw(); void update(); void fire( ludzik & man ); void colide();
A gdzie są implementacje powyższych metod? |
|
« 1 » 2 |