Ошибка компиляции нескольких классов

0

Все еще изучая c++, и все же я застрял здесь, я получил эти классы:

Case.cpp:

#include "../inc_bomber/Case.hh"

Case::Case()
{

}

Case::~Case()
{

}

Case.hh:

#ifndef _CASE_HH_
# define _CASE_HH_

enum Type
  {
    FLOOR,
    WALL,
    BOMB,
    BLOCK,
    PLAYER1,
    PLAYER2,
    BOT,
    BONUS,
  };

class Case
{
private:

public:
  Case();
  virtual ~Case();

  virtual Type  getType() const = 0;
  virtual void  action() = 0;
  virtual int   getPos(int x, int y);
};

#endif /* CASE_HH_ */

Я использую эти виртуальные классы следующим образом:

Player1.hh:

#ifndef _PLAYER1_HH_
# define _PLAYER1_HH_

#include "Case.hh"
#include "Map.hh"

class Player1 : public Case
{
private:
  int  x;
  int  y;

public:
  Player1();
  ~Player1();
  virtual Type getType() const;
  virtual void action();
  virtual void print_stuff();
  virtual int getPos(int x, int y);
};

#endif /* _PLAYER1_HH */

во время компиляции я получил эту ошибку, я предполагаю, что я запутываю виртуальное использование, но все равно не нахожу свою ошибку

g++ -Wall -Wextra -ansi -g3 -I includes/  -c src_bomber/Case.cpp -o src_bomber/Case.o
g++ -o bomber src_bomber/main.o src_bomber/GameMain.o src_bomber/Map.o src_bomber/Case.o src_bomber/Floor.o src_bomber/Block.o src_bomber/Wall.o src_bomber/Bomb.o src_bomber/Bot.o src_bomber/Player1.o src_bomber/Player2.o -Llibs/ -lgdl_gl -lGL -lGLEW -ldl -lrt -lfbxsdk -lSDL2 -lpthread -Wl,-rpath=./libs/
src_bomber/Case.o:(.rodata._ZTV4Case[vtable for Case]+0x30): undefined reference to 'Case::getPos(int, int)'
collect2: ld returned 1 exit status
make: *** [bomber] Error 1
Теги:
gcc
virtual

1 ответ

2
Лучший ответ

Case::getPos(int, int); не является чистым виртуальным (= 0), поэтому он должен иметь реализованную реализацию (если вы когда-либо называете getPos(int,int) ссылкой на Case). Вы должны добавить = 0 к объявлению Case::getPos(int,int), как это было сделано со всеми другими функциями виртуального члена Case, или вы должны добавить реализацию Case::getPos(int,int), так как вы сделали это с конструктором и деструктором Case.

  • 0
    кажется, работает отлично, спасибо :) Я не понимаю, почему я должен ставить те = 0 каждый раз в конце, это трюк cpp?
  • 0
    Когда вы ставите = 0, вы ДОЛЖНЫ определить и реализовать функцию в производных классах. Это так называемые чисто виртуальные функции.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню