【问题标题】:Undefined reference to vtable but method overriden未定义对 vtable 的引用,但方法被覆盖
【发布时间】:2021-05-31 08:34:35
【问题描述】:

我在编译我的程序时遇到问题,这似乎是我们没有实现虚拟方法时发生的问题,但在我的情况下我已经实现了它。

class Circle : public Viewable{
private:
    int _x,_y,_radius;
    Color *_color;
public:
    void draw();

    Circle(Viewport *v, int x, int y, int radius, Color *c) : Viewable(v) {
        _x = x;
        _y = y;
        _radius = radius;
        _color = c;
    }
    ~Circle() {};
};

那个类扩展了这个:

class Viewable {
protected:
   Viewport *viewport;
public:
    virtual void draw()=0;
    virtual ~Viewable(){};
    Viewable(Viewport*v)
    {
        viewport=v;
    }
};

问题如下: 未定义对“vtable for Circle”的引用

这是Circle.cpp

void Circle::draw(){
        int x0 = _radius, y0 = 0;
        int radiusError = 1 - x0;

        while (y0 <= x0) {
            viewport->SetPixel(x0 + _x, y0 + _y, *_color);
            viewport->SetPixel(y0 + _x, x0 + _y, *_color);
            viewport->SetPixel(-x0 + _x, y0 + _y, *_color);
            viewport->SetPixel(-y0 + _x, x0 + _y, *_color);
            viewport->SetPixel(-x0 + _x, -y0 + _y, *_color);
            viewport->SetPixel(-y0 + _x, -x0 + _y, *_color);
            viewport->SetPixel(x0 + _x, -y0 + _y, *_color);
            viewport->SetPixel(y0 + _x, -x0 + _y, *_color);
            y0++;

            if (radiusError < 0)
                radiusError += 2 * y0 + 1;

            else {
                x0--;
                radiusError += 2 * (y0 - x0 + 1);
            }

        }

这是来自 clion 的日志:

====================[ Build | stpfonctionne | Debug ]===========================
/app/extra/clion/bin/cmake/linux/bin/cmake --build /home/samuel/Bureau/stpfonctionne/cmake-build-debug --target stpfonctionne -- -j 6
[ 33%] Linking CXX executable stpfonctionne
/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0/../../../../x86_64-unknown-linux-gnu/bin/ld: CMakeFiles/stpfonctionne.dir/main.cpp.o: attention: réadressage sur « _ZTV6Circle » dans la section en lecture seule « .text._ZN6CircleC2EP8ViewportS1_iiiP5Color[_ZN6CircleC5EP8ViewportS1_iiiP5Color] »
/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0/../../../../x86_64-unknown-linux-gnu/bin/ld : CMakeFiles/stpfonctionne.dir/main.cpp.o : dans la fonction « Circle::Circle(Viewport*, Viewport*, int, int, int, Color*) » :
/home/samuel/Bureau/stpfonctionne/headers//circle.h:19 : référence indéfinie vers « vtable for Circle »
/usr/lib/gcc/x86_64-unknown-linux-gnu/10.2.0/../../../../x86_64-unknown-linux-gnu/bin/ld: attention: création de DT_TEXTREL dans un PIE
collect2: erreur: ld a retourné le statut de sortie 1
make[3]: *** [CMakeFiles/stpfonctionne.dir/build.make:118 : stpfonctionne] Erreur 1
make[2]: *** [CMakeFiles/Makefile2:95 : CMakeFiles/stpfonctionne.dir/all] Erreur 2
make[1]: *** [CMakeFiles/Makefile2:102 : CMakeFiles/stpfonctionne.dir/rule] Erreur 2
make: *** [Makefile:137 : stpfonctionne] Erreur 2

【问题讨论】:

  • 你实现Circle::draw()了吗?您已经在课堂上声明了它,但您是否为它提供了定义?
  • 请提取minimal reproducible example 并在此处提供,以及用于编译的完整命令行和产生的错误消息。很可能,您会以这种方式自己发现错误。
  • CLion 通常是基于 cmake 的。你也可以发布顶级CMakeLists.txt吗?警告中对 PIE 的引用似乎很奇怪。
  • 你只链接main.cpp.o而不链接circle.cpp.o,很有可能circle.cpp没有被添加到项目中并且被cmake使用
  • 链接错误指的是这个6参数的构造函数:Circle(Viewport*, Viewport*, int, int, int, Color*)你声明的构造函数有5个参数:Circle(Viewport *v, int x, int y, int radius, Color *c)

标签: c++


【解决方案1】:

显然你们中的一些人是对的,这是链接的问题,某些文件不在 makefile 中。

【讨论】:

    【解决方案2】:

    Circle::draw() 不能是虚拟的。只有基类方法应该是虚拟的。 同样适用于 Circle 析构函数。 而虚拟基类析构函数实际上应该声明为virtual ~Viewable() = default;

    【讨论】:

    • 是的,但这仍然是一件坏事
    • 所以这不能回答问题。
    • 我想可能是这样。现在我已经尝试过了,它有效,所以是的,不是答案。随意投反对票
    猜你喜欢
    • 2012-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多