1

我已经阅读了有关此问题的常见问题解答和其他几个网站,但我似乎找不到合适的解决方案。我很确定你以前听过这个问题,如果可能的话,我想就如何解决这个问题寻求具体帮助。

具体的错误是: 错误:未定义对 `vtable for FGui' 的引用 它总是指向 fgui.cpp 中的构造函数,但我看不出它有什么问题。

FGui 是继承自一个名为“FFoo”的类,该类继承自 QMainWindow。相关代码:

(在 ffoo.h 中:)

class Ffoo : public QMainWindow
{
Q_OBJECT
public:
    Ffoo();
    ~Ffoo();
    (...)
};

(在 ffoo.cpp 中:)

Ffoo::Ffoo()
{
    textEdit = 0;
    tcpSock = 0;
    setupConnectBox();
}

Ffoo::~Ffoo()
{}

FGui 文件仍然很简单,因为我最近才开始制作课程。

(fgui.h:)

class FGui : public Ffoo
{
    Q_OBJECT
public:
    FGui();
    ~FGui();
};

(fgui.cpp:)

FGui::FGui() : Ffoo()
{}

FGui::~FGui()
{}

如果有人能告诉我如何解决这个问题,我将不胜感激。提前致谢。:)

4

5 回答 5

6

尝试重新运行 qmake。如果您使用 Qt Creator,请清理项目(Build/Clean All),然后选择 Build/Run qmake。在这种情况下,这通常会有所帮助。

于 2011-02-01T16:26:29.197 回答
4

您需要对源文件运行 moc 。如果您使用qmake创建 makefile ,只要您在 .pro 文件中包含 .cpp 和 .h 文件,这就会自动发生。您可能忘记了其中一个步骤。请注意,如果您的类在您上次运行 qmake 期间不包含 Q_OBJECT 宏,则仅运行 make 不会调用 moc 来运行。您需要再次运行 qmake才能这样做!

然后会发生以下过​​程:如果你运行“make”,不仅你的 .cpp 文件被编译,而且一个额外的 .cpp 文件被 moc(元对象编译器)创建,然后也被编译。第二个 .cpp 文件包含信号的实现。请注意,信号实际上是将调用“转发”到连接的插槽(或信号)的普通方法。这个实现是 moc 生成的(除其他外)。即使您的类不包含信号,由于某些内部使用的(?)虚函数,这些类也需要有一个 vtable……但是,如果您的源文件包含基于 QObject 的类,则确实需要运行 moc。

于 2011-02-01T18:08:57.780 回答
3

你需要模拟你的FGui和 Ffoo 类。

于 2011-02-01T16:20:33.950 回答
2

对 vtable 的未定义引用意味着您没有实现纯虚拟方法。它可能是您忘记在 FGui 中实现的 Ffoo 中的纯虚拟方法,或者,如果您使用信号,则可能您没有使用元对象编译器(它将实现缺失的方法),正如其他人所说。

于 2011-02-01T17:05:27.840 回答
2

当您在源文件的开发后期添加 Q_OBJECT 宏时,您通常会得到此信息。Makefile 并不认为你必须 moc 文件,所以它没有,你会得到这些 vtable 错误。正如其他人所指出的,只需重新运行 qmake。如果您使用的是 Creator,它位于 Build 菜单下。

于 2011-02-01T21:13:48.477 回答