我已经开始学习C ++了,我已经知道C和Java了。我已经开始学习它,因为我想开始使用面向对象的编程。
但是,由于编译器生成“对于vtable for Actor”的未定义引用,因此我无法使用代码。在这里你有代码产生相同的错误,而不是原始的错误,因为它不太清楚。我真的不知道是什么原因造成的。
struct Actor
{
int x, y;
virtual void move();
};
struct Player : Actor
{
Player(int a, int b)
{
x = a;
y = b;
}
void move();
void draw();
};
void Player::move()
{
++x;
};
main()
{
Actor *act;
act = new Player(10, 20);
}
这个问题可能是愚蠢的,我不知道,我到处挖,但没有找到能解决我问题的事情。
答案 0 :(得分:8)
您需要使virtual void move();
成为纯虚函数:
virtual void move() = 0;
或为基类定义Actor::move()
void Actor::move()
{
// do something
}
答案 1 :(得分:1)
在Actor中定义
virtual void move() = 0;
而不是
virtual void move();
答案 2 :(得分:0)
错误对vtable的未定义引用通常意味着声明了虚函数但未定义。
答案 3 :(得分:0)
@Maxim在你的案例中提供了答案,但更一般地说(来自@Maxim提供的链接):
解决方案是确保定义所有非纯的虚拟方法。请注意,即使将析构函数声明为纯虚拟,也必须定义析构函数。
导致我停顿的是上述引文中的最后一句,乍一看并不明显。
答案 4 :(得分:0)
对于每个具有虚函数的类,都是vtable中的类的一个条目,它还包含指向所有虚函数的指针。
因为出现虚拟void move();在基类声明中,编译器查找类定义(即)vtable中的相应条目,因为你没有定义,所以这里没有。
如此纯粹的虚函数将解决错误。