我刚刚开始用SFML 2.0编写一个简单的游戏。
我创建了AABB类,它继承了SFML的两个类,以编写类draw()方法。
但是我总是得到这个错误:
\main.cpp|14|error: cannot declare variable 'block' to be of abstract type 'AABB'|
码:
#include <SFML/Graphics.hpp>
#include <vector>
#include <iostream>
#include "headers/system.h"
#include "headers/AABB.h"
using namespace std;
int main()
{
sf::RectangleShape shape(sf::Vector2f(50,50));
AABB block (shape);
System sys;
if(!sys.create())
{
cout << "Critical error! Did you modified ini files?";
return EXIT_FAILURE;
}
sf::RenderWindow * WindowApp = sys.getHandle();
while (WindowApp->isOpen())
{
sf::Event event;
while (WindowApp->pollEvent(event))
{
if (event.type == sf::Event::Closed)
WindowApp->close();
if(event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Escape)
WindowApp->close();
}
WindowApp->draw(block);
WindowApp->clear();
WindowApp->display();
}
return EXIT_SUCCESS;
}
AABB.h:
#include <SFML\Graphics.hpp>
#include <SFML\System.hpp>
#include <SFML\Audio.hpp>
#include <SFML\Network.hpp>
using namespace std;
class AABB : public sf::Drawable, public sf::Transformable
{
public:
AABB(sf::Vector2f pos, sf::Vector2f size) :
m_pos(pos),
m_size(size) {}
AABB(sf::RectangleShape shape) :
m_sprite(shape)
{}
private:
virtual void draw(sf::RenderTarget& target) const ;
private:
sf::Vector2f m_size;
sf::Vector2f m_pos;
sf::RectangleShape m_sprite;
};
AABB.cpp
#include "../headers/AABB.h"
using namespace std;
void AABB::draw(sf::RenderTarget& target) const
{
target.draw(m_sprite);
}
我认为系统类在这里并不重要:D
顺便说一句,当我从类应用程序编译中删除继承而没有错误时。我该怎么办?请帮我 :)
最佳答案
您的类AABB
继承了作为抽象类的sf::Drawable
,并且AABB
不会覆盖它的所有纯虚函数-这对于使AABB
成为具体的类并具有其对象是必要的。我怀疑这是拼写错误的结果。你在哪里写
virtual void draw(sf::RenderTarget& target) const ;
在
AABB.h
中,应该是virtual void draw(sf::RenderTarget& target, sf::RenderStates) const ;
因为后者是
sf::Drawable
的纯虚函数的签名,如SFML documentation中所述。您自然也必须在AABB.cpp
中更改此函数的定义。关于c++ - C++错误:无法声明变量“block”为抽象类型“AABB”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28011673/