load(“Assets/circle.png”,“player”,渲染器); } void Player::HandleEvents() { SDL_事件; if(SDL_事件和事件)) { 开关(事件类型) { 案例SDL_按键关闭: 开关(event.key.keysym.sym) { 案例SDLK_a: 调试消息(“按下按钮”); 位置->m_x-=10; 打破 案例SDLK\U d: 调试消息(“D按下”); 位置->m_x+=10; 打破 } 打破 } } } void Player::Update() { Vector2D*p=InputHandler::Instance()->GetMousePosition(); 调试消息(p->GetY()); 调试消息(p->GetX()); currantFrame=int((SDL_GetTicks()/100)%4); } void Player::Draw() { 动画管理器::实例()->动画(“播放器”,(int)位置->GetX(),(int)位置->GetY(),90,82,0,当前帧,渲染器,SDL\u翻转\u无); },c++,sdl,virtual,abstract,C++,Sdl,Virtual,Abstract" /> load(“Assets/circle.png”,“player”,渲染器); } void Player::HandleEvents() { SDL_事件; if(SDL_事件和事件)) { 开关(事件类型) { 案例SDL_按键关闭: 开关(event.key.keysym.sym) { 案例SDLK_a: 调试消息(“按下按钮”); 位置->m_x-=10; 打破 案例SDLK\U d: 调试消息(“D按下”); 位置->m_x+=10; 打破 } 打破 } } } void Player::Update() { Vector2D*p=InputHandler::Instance()->GetMousePosition(); 调试消息(p->GetY()); 调试消息(p->GetX()); currantFrame=int((SDL_GetTicks()/100)%4); } void Player::Draw() { 动画管理器::实例()->动画(“播放器”,(int)位置->GetX(),(int)位置->GetY(),90,82,0,当前帧,渲染器,SDL\u翻转\u无); },c++,sdl,virtual,abstract,C++,Sdl,Virtual,Abstract" />

抽象类C++; P> >我的理解是,C++中的类抽象必须创建一个类,只需要一个类中的纯虚方法。在我的代码中,我创建了一个抽象的GameObject类,它由我的Player类继承,但问题是我的Player.cpp中出现了错误,错误是LNK2001:unresolved External symbol“public:virtual void_uthiscall GameObject::Load(void)”(?Load@GameObject@@UAEXXZ)对于除初始化以外的所有方法,当我把它们都设为0时,这个问题就解决了,我只是想知道为什么 // Abstract class to provide derived classes with common attributes #include <SDL.h> #include "AnimationManager.h" #include "Debug.h" #include "InputHandler.h" class GameObject { public: virtual void Initialise() = 0; virtual void Load(); virtual void HandleEvents(); virtual void Update(); virtual void Draw(); Vector2D* position; int currantFrame; SDL_Renderer* renderer; float speed; bool alive; }; #include "GameObject.h" class Player : public GameObject { public: virtual void Initialise(); virtual void Load(); virtual void HandleEvents(); virtual void Update(); virtual void Draw(); Player(SDL_Renderer* r); ~Player(); }; #include "Player.h" Player::Player(SDL_Renderer* r) { renderer = r; } Player::~Player() { } void Player::Initialise() { position = new Vector2D(10, 10); currantFrame = 0; } void Player::Load() { TheAnimationManager::Instance()->load("Assets/circle.png", "player", renderer); } void Player::HandleEvents() { SDL_Event event; if (SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_a: DEBUG_MSG("A Pressed"); position->m_x -= 10; break; case SDLK_d: DEBUG_MSG("D Pressed"); position->m_x += 10; break; } break; } } } void Player::Update() { Vector2D* p = TheInputHandler::Instance()->GetMousePosition(); DEBUG_MSG(p->GetY()); DEBUG_MSG(p->GetX()); currantFrame = int(((SDL_GetTicks() / 100) % 4)); } void Player::Draw() { TheAnimationManager::Instance()->Animate("player", (int)position->GetX(), (int)position->GetY(), 90, 82, 0, currantFrame, renderer, SDL_FLIP_NONE); } //抽象类提供具有公共属性的派生类 #包括 #包括“AnimationManager.h” #包括“Debug.h” #包括“InputHandler.h” 类游戏对象 { 公众: 虚拟void Initialise()=0; 虚空荷载(); 虚拟void HandleEvents(); 虚拟空更新(); 虚空绘制(); 矢量2D*位置; 国际货币框架; SDL_渲染器*渲染器; 浮动速度; 布尔活着; }; #包括“GameObject.h” 类玩家:公共游戏对象 { 公众: 虚空初始化(); 虚空荷载(); 虚拟void HandleEvents(); 虚拟空更新(); 虚空绘制(); 播放器(SDL_渲染器*r); ~Player(); }; #包括“Player.h” 播放器::播放器(SDL_渲染器*r) { r=r; } 玩家::~Player() { } void Player::初始化() { 位置=新矢量2D(10,10); currentframe=0; } void Player::Load() { 动画管理器::实例()->load(“Assets/circle.png”,“player”,渲染器); } void Player::HandleEvents() { SDL_事件; if(SDL_事件和事件)) { 开关(事件类型) { 案例SDL_按键关闭: 开关(event.key.keysym.sym) { 案例SDLK_a: 调试消息(“按下按钮”); 位置->m_x-=10; 打破 案例SDLK\U d: 调试消息(“D按下”); 位置->m_x+=10; 打破 } 打破 } } } void Player::Update() { Vector2D*p=InputHandler::Instance()->GetMousePosition(); 调试消息(p->GetY()); 调试消息(p->GetX()); currantFrame=int((SDL_GetTicks()/100)%4); } void Player::Draw() { 动画管理器::实例()->动画(“播放器”,(int)位置->GetX(),(int)位置->GetY(),90,82,0,当前帧,渲染器,SDL\u翻转\u无); }

抽象类C++; P> >我的理解是,C++中的类抽象必须创建一个类,只需要一个类中的纯虚方法。在我的代码中,我创建了一个抽象的GameObject类,它由我的Player类继承,但问题是我的Player.cpp中出现了错误,错误是LNK2001:unresolved External symbol“public:virtual void_uthiscall GameObject::Load(void)”(?Load@GameObject@@UAEXXZ)对于除初始化以外的所有方法,当我把它们都设为0时,这个问题就解决了,我只是想知道为什么 // Abstract class to provide derived classes with common attributes #include <SDL.h> #include "AnimationManager.h" #include "Debug.h" #include "InputHandler.h" class GameObject { public: virtual void Initialise() = 0; virtual void Load(); virtual void HandleEvents(); virtual void Update(); virtual void Draw(); Vector2D* position; int currantFrame; SDL_Renderer* renderer; float speed; bool alive; }; #include "GameObject.h" class Player : public GameObject { public: virtual void Initialise(); virtual void Load(); virtual void HandleEvents(); virtual void Update(); virtual void Draw(); Player(SDL_Renderer* r); ~Player(); }; #include "Player.h" Player::Player(SDL_Renderer* r) { renderer = r; } Player::~Player() { } void Player::Initialise() { position = new Vector2D(10, 10); currantFrame = 0; } void Player::Load() { TheAnimationManager::Instance()->load("Assets/circle.png", "player", renderer); } void Player::HandleEvents() { SDL_Event event; if (SDL_PollEvent(&event)) { switch(event.type) { case SDL_KEYDOWN: switch(event.key.keysym.sym) { case SDLK_a: DEBUG_MSG("A Pressed"); position->m_x -= 10; break; case SDLK_d: DEBUG_MSG("D Pressed"); position->m_x += 10; break; } break; } } } void Player::Update() { Vector2D* p = TheInputHandler::Instance()->GetMousePosition(); DEBUG_MSG(p->GetY()); DEBUG_MSG(p->GetX()); currantFrame = int(((SDL_GetTicks() / 100) % 4)); } void Player::Draw() { TheAnimationManager::Instance()->Animate("player", (int)position->GetX(), (int)position->GetY(), 90, 82, 0, currantFrame, renderer, SDL_FLIP_NONE); } //抽象类提供具有公共属性的派生类 #包括 #包括“AnimationManager.h” #包括“Debug.h” #包括“InputHandler.h” 类游戏对象 { 公众: 虚拟void Initialise()=0; 虚空荷载(); 虚拟void HandleEvents(); 虚拟空更新(); 虚空绘制(); 矢量2D*位置; 国际货币框架; SDL_渲染器*渲染器; 浮动速度; 布尔活着; }; #包括“GameObject.h” 类玩家:公共游戏对象 { 公众: 虚空初始化(); 虚空荷载(); 虚拟void HandleEvents(); 虚拟空更新(); 虚空绘制(); 播放器(SDL_渲染器*r); ~Player(); }; #包括“Player.h” 播放器::播放器(SDL_渲染器*r) { r=r; } 玩家::~Player() { } void Player::初始化() { 位置=新矢量2D(10,10); currentframe=0; } void Player::Load() { 动画管理器::实例()->load(“Assets/circle.png”,“player”,渲染器); } void Player::HandleEvents() { SDL_事件; if(SDL_事件和事件)) { 开关(事件类型) { 案例SDL_按键关闭: 开关(event.key.keysym.sym) { 案例SDLK_a: 调试消息(“按下按钮”); 位置->m_x-=10; 打破 案例SDLK\U d: 调试消息(“D按下”); 位置->m_x+=10; 打破 } 打破 } } } void Player::Update() { Vector2D*p=InputHandler::Instance()->GetMousePosition(); 调试消息(p->GetY()); 调试消息(p->GetX()); currantFrame=int((SDL_GetTicks()/100)%4); } void Player::Draw() { 动画管理器::实例()->动画(“播放器”,(int)位置->GetX(),(int)位置->GetY(),90,82,0,当前帧,渲染器,SDL\u翻转\u无); },c++,sdl,virtual,abstract,C++,Sdl,Virtual,Abstract,可能通过非纯虚拟的基类指针调用的每个虚拟方法都需要实现 你似乎对抽象/虚拟的工作方式有着落后的认识。如果不选择将类抽象化,为什么要这样做?您选择将成员函数设置为纯虚拟函数,因为它没有合理的实现。然后,由于具有纯虚函数,类变得抽象 类变得抽象并不意味着它的每一个函数都突然变得纯粹虚拟 您的错误是链接器错误。链接器正在寻找GameObject::Load函数的实现,您没有提供该函数。如果将函数标记为纯虚拟,则链接器不会查找实现。可能通过非纯虚拟的基类指针调用的每个虚拟方法都需要有一个实现 你似乎对抽

可能通过非纯虚拟的基类指针调用的每个虚拟方法都需要实现

你似乎对抽象/虚拟的工作方式有着落后的认识。如果不选择将类抽象化,为什么要这样做?您选择将成员函数设置为纯虚拟函数,因为它没有合理的实现。然后,由于具有纯虚函数,类变得抽象

类变得抽象并不意味着它的每一个函数都突然变得纯粹虚拟


您的错误是链接器错误。链接器正在寻找
GameObject::Load
函数的实现,您没有提供该函数。如果将函数标记为纯虚拟,则链接器不会查找实现。

可能通过非纯虚拟的基类指针调用的每个虚拟方法都需要有一个实现

你似乎对抽象/虚拟的工作方式有着落后的认识。如果不选择将类抽象化,为什么要这样做?您选择将成员函数设置为纯虚拟函数,因为它没有合理的实现。然后,由于具有纯虚函数,类变得抽象

类变得抽象并不意味着它的每一个函数都突然变得纯粹虚拟


您的错误是链接器错误。链接器正在寻找
GameObject::Load
函数的实现,您没有提供该函数。如果将函数标记为纯虚拟函数,则链接器不会查找实现。

有些编译器要求,对于每个签名,只能在基类中指定一次virtual关键字。试试这个:

class GameObject
{
public:
    virtual void Initialise() = 0;
    virtual void Load() = 0;
    virtual void HandleEvents() = 0;
    virtual void Update() = 0;
    virtual void Draw() = 0;
...
};

class Player : public GameObject
{
public:
    void Initialise();
    void Load();
    void HandleEvents();
    void Update();
    void Draw();
...
};

有些编译器要求在基类中为每个签名只指定一次virtual关键字。试试这个:

class GameObject
{
public:
    virtual void Initialise() = 0;
    virtual void Load() = 0;
    virtual void HandleEvents() = 0;
    virtual void Update() = 0;
    virtual void Draw() = 0;
...
};

class Player : public GameObject
{
public:
    void Initialise();
    void Load();
    void HandleEvents();
    void Update();
    void Draw();
...
};

如果您不需要publicGameObject::Initialise方法是纯虚拟的,至少给它一个空的主体,如下所示

class GameObject
{
public:
    void Initialise() {}
    ...
};

如果您不需要publicGameObject::Initialise方法是纯虚拟的,至少给它一个空的主体,如下所示

class GameObject
{
public:
    void Initialise() {}
    ...
};

另一个猜想是:你的代码中是否有任何GameObject的实例?你有这样的东西吗:

GameObject go;
void foo( GameObject go );
GameObject bar();
vector<GameObject> all_my_objects;
或者像这样:

GameObject go;
void foo( GameObject go );
GameObject bar();
vector<GameObject> all_my_objects;
或者像这样:

GameObject go;
void foo( GameObject go );
GameObject bar();
vector<GameObject> all_my_objects;
或者像这样:

GameObject go;
void foo( GameObject go );
GameObject bar();
vector<GameObject> all_my_objects;
矢量化所有我的对象;

另一个猜测:您的代码中是否有任何GameObject的实例?你有这样的东西吗:

GameObject go;
void foo( GameObject go );
GameObject bar();
vector<GameObject> all_my_objects;
或者像这样:

GameObject go;
void foo( GameObject go );
GameObject bar();
vector<GameObject> all_my_objects;
或者像这样:

GameObject go;
void foo( GameObject go );
GameObject bar();
vector<GameObject> all_my_objects;
或者像这样:

GameObject go;
void foo( GameObject go );
GameObject bar();
vector<GameObject> all_my_objects;
矢量化所有我的对象;

您会遇到什么错误?1)请发布准确的错误以及相应的行。2) 请确保抽象类中的每个抽象方法在“Player”类中都有相应的实现(看起来您已经在这样做了)。3) 这里有一个很好的链接:编辑了我的问题和代码你有什么错误?1)请发布准确的错误,以及相应的行。2) 请确保抽象类中的每个抽象方法在“Player”类中都有相应的实现(看起来您已经在这样做了)。3) 这里有一个很好的链接:编辑了我的问题,代码不是很完整。非
virtual
方法只有在可以以某种方式调用时才需要定义。例如,如果我去掉GameObject类中initialise方法的=0部分,我会得到以下错误LNK2001:unre