gpt4 book ai didi

c++ - 链接器错误 : Undefined Reference to `vtable for square` . 代码包含虚函数

转载 作者:太空狗 更新时间:2023-10-29 20:46:11 24 4
gpt4 key购买 nike

我检查了最常见的 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) 函数(只需一个空白的 void Square::Collide(Shape &p) {} 就可以了)和特定的vtable 错误应该会消失。

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

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

关于c++ - 链接器错误 : Undefined Reference to `vtable for square` . 代码包含虚函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8830025/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com