【问题标题】:Undefined reference to vtable (C++) [duplicate]对 vtable(C++)的未定义引用 [重复]
【发布时间】:2014-06-04 13:51:04
【问题描述】:

我正在为我的 sfml 游戏制作一个实体类,但我不明白为什么以下代码无法编译。我收到 undefined reference to vtable in Entity 错误。

这是头文件:

#ifndef ENTITY_H
#define ENTITY_H
#include <string>
#include <SFML/System/Vector2.hpp>
#include <SFML/Graphics/Rect.hpp>
#include <SFML/System/Time.hpp>

class Entity
{
public:
        Entity(std::string id, sf::Vector2f position, float rotation );
        virtual ~Entity() = 0;
        virtual sf::FloatRect getBoundingRect() const;
        virtual float getRadius() const;
        void UpdateVelocity(sf::Time);
        void UpdatePosition(sf::Time);
        void Update(sf::Time);
        float getRotation() const;
        sf::Vector2f getPosition() const;
        sf::Vector2f getVelocity() const;
        sf::Vector2f getAcceleration() const;


private:
        std::string mId;
        sf::Vector2f mPosition;
        float mRotation;
        sf::Vector2f mVelocity;
        sf::Vector2f mAcceleration;
};

#endif // ENTITY_H

这里是cpp文件:

#include "../include/Entity.h"

Entity::Entity(std::string id, sf::Vector2f position, float rotation)
        : mId(id)
        , mPosition(position)
        , mRotation(rotation)
{
}

Entity::~Entity()
{
}


void Entity::UpdateVelocity(sf::Time dt)
{
        mVelocity += mAcceleration;
}

void Entity::UpdatePosition(sf::Time dt)
{
        mPosition += mVelocity;
}

void Entity::Update(sf::Time dt)
{
        UpdateVelocity(dt);
        UpdatePosition(dt);
}

float Entity::getRotation() const
{
        return mRotation;
}

sf::Vector2f Entity::getPosition() const
{
        return mPosition;
}

sf::Vector2f Entity::getVelocity() const
{
        return mVelocity;
}

sf::Vector2f Entity::getAcceleration() const
{
        return mAcceleration;
}

非常感谢任何帮助!

【问题讨论】:

    标签: c++


    【解决方案1】:

    您缺少一些虚拟方法的实现:

        virtual sf::FloatRect getBoundingRect() const;
        virtual float getRadius() const;
    

    如果您不希望您的 Entity 类实现这些,请将它们声明为纯虚拟:

        virtual sf::FloatRect getBoundingRect() const = 0;
        virtual float getRadius() const = 0;
    

    请注意,正如@JoachimIsaksson 所评论的,您是否需要您的析构函数是纯虚拟的并不完全清楚。您已经为它提供了一个空实现,但您仍然需要派生类型来实现它。是否需要它是纯虚拟的可能值得考虑。

    【讨论】:

    • 非常感谢他们应该被宣布为纯虚拟,我完全错过了!
    • @Veritas 好的,我正在添加它作为替代方案。
    • @Veritas ~Entity() 也被声明为纯虚拟并无论如何实现。
    • @juanchopanza 是的,但是一个空的虚拟实现通常不是很有用,所以我想我会指出它以防它不是故意的。
    • 纯虚拟析构函数必须定义了它的主体——在派生的析构函数运行后它仍然会被调用。使函数成为纯虚函数的效果是强制派生类覆盖它。这与它是否有实现是正交的。
    猜你喜欢
    • 2011-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多