其他分享
首页 > 其他分享> > c – 链接器错误:未定义引用`vtable for square`.代码包括虚函数

c – 链接器错误:未定义引用`vtable for square`.代码包括虚函数

作者:互联网

我已经在这里检查了最常见的undefined reference to vtable问题,虽然这让我对正在发生的事情有了更好的理解,但我仍然无法收集到足够的信息来弄清楚我为什么会遇到这个错误.

我有一个简单的Square类,最初我试图从Polygon类继承.既然我已经相对知道了C并且还在学习,我还没有那么多地尝试过多态性.

无论如何,在我试图摆脱基类(Polygon)后,我认为这可能有所帮助.不幸的是,我仍然遇到同样的错误,我不知道发生了什么.我所知道的是,最初,Polygon类需要一个至少包含构造函数定义的源文件,我确实给了它.这消除了Polygon类的vtable错误.

我的主要问题是我仍然使用Square类,它应该从Polygon类继承.我想知道的是,我如何正确实现这一点,以避免在获得多态性的好处的同时获得vtable错误?

Polygon.h /的.cpp

#ifndef POLYGON_H
#define POLYGON_H

#include "Shape.h"
#include "vector3f.h"

class Polygon
{
public:
    Polygon();
    virtual void Collide(Shape &s) = 0;
    virtual void Collide(Polygon &p) = 0;
    virtual bool Intersects(const Shape &s) = 0;
    virtual bool Intersects(const Polygon &s) = 0;
protected:
    virtual void Draw() const = 0;
};

#endif // POLYGON_H

//------------------

#include "Polygon.h"

Polygon::Polygon() {


}

* Square.h /的.cpp

#ifndef SQUARE_H
#define SQUARE_H

#include "Polygon.h"
#include "Shape.h"
#include "Vec3f.h"
#include <QGLWidget>

class Square //: public Polygon
{
public:
    Square(Vec2f lenwidth = Vec2f(), Vec3f color = Vec3f());
    ~Square();

    virtual void Collide(Shape &s);
    virtual void Collide(Square &s);
    virtual void Collide(Polygon &p);
    virtual bool Intersects(const Shape &s);
    virtual bool Intersects(const Polygon &p);
    virtual bool Intersects(const Square &s);
    virtual float Area(void) const;

protected:
    virtual void Draw();

private:
    Vec2f mDimensions;
    Vec3f mColor;

};

#endif // SQUARE_H

//----------------

#include "Square.h"

/**********/
/* PUBLIC */
/**********/

Square::Square(Vec2f lenwidth, Vec3f color) //: Polygon()
{
    this->mDimensions = lenwidth;
    this->mColor = color;
}

Square::~Square() {

}

void Square::Collide(Polygon &p) {

}

/************/
/* PRIVATE  */
/************/

void Square::Draw() {
    const int numPoints = mDimensions.X * mDimensions.Y;
    glBegin(GL_LINE_STRIP);
    glColor3f(mColor.X, mColor.Y, mColor.Z);

    for (double i = 0; i <= numPoints; i++) {
        const float x = mDimensions.X;
        const float y = mDimensions.Y;

        glVertex3f(x, y, 0.0);

        mDimensions.X += 1;
        mDimensions.Y += 1;
    }
}

解决方法:

vtable链接错误的原因是你没有定义你的类中的第一个虚函数(即Collide(Shape& p)). (vtable通常与第一个虚函数定义一起存储)

添加一个void Square :: Collide(Shape& p)函数(只是空白的Square :: Collide(Shape& p){}应该可以工作)并且该特定的vtable错误应该消失.

请注意,您可能应该定义标题中的所有函数.

请记住,参数类型区分函数就像C中的名称一样,碰撞(形状)与碰撞(多边形)不同.

标签:vtable,c,undefined-reference,linker-errors
来源: https://codeday.me/bug/20190902/1791972.html