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

[C++] Dziedziczenie klasy abstakcyjnej

Ostatnio zmodyfikowano 2012-11-12 22:00
Autor Wiadomość
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

C/C++
#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 // POCISK_H

na podstawie tej klasy próbuję utworzyć klasę

C/C++
#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_H
Ale już przy próbie definicji konstruktora i destruktora Code::Block sygnalizuje błędy.
zwykly.cpp
C/C++
#include "zwykly.h"

zwykly::zwykly()
{
    //ctor
}

zwykly::~zwykly()
{
    //dtor
}

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?
P-69048
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).
P-69056
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
P-69057
crash
» 2012-11-12 19:48:41
Nie chodzi o usunięcie. Po to się deklaruje nagłówki metod w klasach:

C/C++
class JakasKlasa
{
public:
    JakasKlasa( typ param1, typ2 param2,...);
    ...
};

 żeby poza tymi klasami w odpowiednim miejscu kodu napisać ich rozwinięcia:

C/C++
...
JakasKlasa( typ param1, typ2 param2, itp...)
{
    //cialo metody
}

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
P-69058
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:
C/C++
#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
P-69074
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.
Frazy, które należy wpisać w wyszukiwarkę google:
P-69077
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ą;)).
C/C++
#include "pocisk.h"

pocisk::pocisk()
{
   
}
pocisk::~pocisk()
{
   
}

PS. Kod wszystkich plików:

pocisk.h

C/C++
#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 // POCISK_H

ludzik.cpp

C/C++
#include "pocisk.h"

pocisk::pocisk()
{
   
}
pocisk::~pocisk()
{
   
}

zwykly.h

C/C++
#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_H

zwykly.cpp

C/C++
#include "zwykly.h"

zwykly::zwykly() //blad, a nawet 2
{
    speed = 15;
    live = false;
}

zwykly::~zwykly() //blad, a nawet 2
{
   
}
P-69079
DejaVu
» 2012-11-12 21:44:12
C/C++
void draw();
void update();
void fire( ludzik & man );
void colide();
A gdzie są implementacje powyższych metod?
P-69084
« 1 » 2
  Strona 1 z 2 Następna strona