Ошибка компоновщика: неопределенная ссылка на `vtable for square`.Код включает в себя виртуальные функции - PullRequest
3 голосов
/ 12 января 2012

Здесь я проверил самый распространенный неопределенный вопрос о vtable, и хотя это дало мне лучшее понимание происходящего, я все еще не смог собрать достаточно информации чтобы выяснить, почему у меня эта ошибка.

У меня есть простой класс Square, который изначально я пытался унаследовать от класса Polygon. Поскольку я относительно хорошо знал C ++ и все еще учусь, я не слишком много экспериментировал с полиморфизмом.

В любом случае, после того, как я попытался избавиться от базового класса (Polygon), я подумал, что это может помочь. К сожалению, я все еще получаю ту же ошибку, и я не совсем знаю, что происходит. Что я знаю, так это то, что первоначально классу Polygon требовался исходный файл с наименьшим определением конструктора, который я и дал. Это избавило от ошибки vtable для класса Polygon.

Моя главная проблема в том, что я все еще получаю это для класса 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;
    }
}

1 Ответ

5 голосов
/ 12 января 2012

Причина ошибки компоновки vtable заключается в том, что вы не определяете первую виртуальную функцию в своем классе (то есть Collide(Shape&p)). (таблицы обычно хранятся вместе с первым определением виртуальной функции)

Добавьте функцию void Square::Collide(Shape &p) (должна работать только пустая строка void Square::Collide(Shape &p) {}), и эта конкретная ошибка vtable должна исчезнуть.

Обратите внимание, что вы, вероятно, должны определить все функции в вашем заголовке.

Помните, что типы аргументов различают функции так же, как имена в C ++, а Collide(Shape) отличается от Collide(Polygon).

...