【发布时间】: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++