所以我尝试使用sdl实现一个pong游戏,但是使用类和继承。
所以我计划有一个基础Puck类来定义我的桨。 PlayerPuck和EnemyPuck将继承这个基类。基础Puck类处理基础板的所有初始化和绘制。从这里我试图派生一个子类在我的playerPaddle上添加额外的东西,比如检查碰撞和边界等。但是当我尝试在我的主类中多态地创建对象时,它会引发我很多错误。
这是我的Base Puck Header文件
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
class Puck{
private:
SDL_Rect puckPaddle;
public:
Puck();
Puck(int x,int y,int width,int height);
int getX();
int getY();
int getHeight();
int getWidth();
SDL_Rect* getPaddleRect();
void setX(int x);
void setY(int y);
void setHeight(int height);
void setWidth(int width);
void Render(); // should be virtual, leave it for now
void Update(); // should be virtual, leave it for now
};
这只是我的头文件。我已经在cpp文件中完成了它的实现,它运行正常。
现在问题出现在我的PlayerPuck中,我从Puck派生出来如下
#include "Puck.h"
class PlayerPuck : public Puck {
public:
PlayerPuck();
PlayerPuck(int x, int y, int width,int height);
void UpdatePosition();
void CheckBounds();
};
在我的主要功能中,当我执行以下操作时,它会给出错误,如
C2504:&#39; Puck&#39;基类未定义
错误C2440:&#39; =&#39; :无法转换为&#39; PlayerPuck *&#39;到了&Puck *&#39;
#include "Ball.h"
#include "Puck.h"
#include "PlayerPuck.h"
Puck* p;
void Initialize(){
if(SDL_Init(SDL_INIT_EVERYTHING) == -1)
running = false;
TTF_Init();
p = new PlayerPuck(50,150,200,100);
}
我的错误是什么?
答案 0 :(得分:0)
我解决了这个问题,只需添加“PlayerPuck.h”头文件并删除“Puck.h”,因为我的主函数中有两个相同的标题
现在,如果我尝试调用虚函数
,我会收到链接器错误在我的基础Puck类中我定义了一个虚函数Test()
#include <SDL.h>
#include <SDL_image.h>
#include <SDL_ttf.h>
class Puck{
private:
SDL_Rect puckPaddle;
public:
Puck();
Puck(int x,int y,int width,int height);
int getX();
int getY();
int getHeight();
int getWidth();
SDL_Rect* getPaddleRect();
void setX(int x);
void setY(int y);
void setHeight(int height);
void setWidth(int width);
**virtual void Test();** --> here
};
我在派生的playerPuck类中调用它
#include "Puck.h"
class PlayerPuck : public Puck {
public:
PlayerPuck();
PlayerPuck(int x, int y, int width,int height);
void UpdatePosition();
void CheckBounds();
**void Test();** --> here
};
当我在main中创建我的playerPuck obj并尝试调用该函数时,它会抛出我 LNK2001 - 未解决的外部符号错误
#include "Ball.h"
#include "PlayerPuck.h"
PlayerPuck* playerPuck;
playerPuck = new PlayerPuck(50,200,20,100);
void Update(){
//playerPuck->UpdatePosition();
playerPuck->Test();
}