【问题标题】:Linker Error: Undefined Reference to `vtable for square`. Code includes virtual functions链接器错误:未定义对 `vtable for square` 的引用。代码包含虚函数
【发布时间】:2012-01-12 04:12:47
【问题描述】:

我在这里查看了最常见的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;
    }
}

【问题讨论】:

    标签: c++ linker-errors vtable undefined-reference


    【解决方案1】:

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

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

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

    请记住,参数类型区分函数就像 C++ 中的名称一样,Collide(Shape)Collide(Polygon) 不同。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-08
      • 1970-01-01
      • 2011-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多