如何在标头中声明一个新类并在源文件中定义它而没有这个错误?

时间:2014-05-30 02:54:40

标签: c++ inheritance vtable

我正处于我想创建一个新类然后在另一个创建的类(C ++)中使用它的情况,但是没有使用不同的头文件或源文件:这两个类应该在同一个地方,单向或者另一个。主类只应包含指向“子”类的指针。

现在我知道在很多情况下完全可以在头文件中定义一个类。事实上,如果一个人不想只设置一个指向那个“子类”的指针,而是实际使用头文件中已有的一种方法(例如,对于内联方法),实际上必须在源文件中定义它:

class ChildClass
{
    public:
        bool myFunctions() { return true; }
}

class MainClass
{
    private:
        ChildClass* poChildClass;
        inline bool getResult() { return poChildClass->myFunctions(); }
}

但是我想我只想在那里指定那个指针,而不需要调用我的ChildClass方法,所以我应该只能声明ChildClass,然后在定义MainClass的同一.cpp文件中定义它:< / p>

//in .hpp
class ChildClass;

class MainClass
{
    private:
        ChildClass* poChildClass;
}

//in .cpp
class ChildClass
{
    public:
        bool myFunctions() { return true; }
}

//etc.

在第一时刻,我不知道会出现什么问题。但是在尝试使用我的一个类(特别是基于Qwt的QwtPlotPicker类)时,我得到了一些编译错误(在最后一个版本中):

error: undefined reference to `vtable for Picker'

错误指出以下代码中的位置(在.cpp中):

class Picker : public QwtPlotPicker
{
    Q_OBJECT
public:
    Picker( QWidget* canvas ) :
        QwtPlotPicker( canvas ) //Here lies the error the compiler says
//...

那么问题是什么?我怎么得到这个“未定义的引用'vtable'”问题?

感谢您的帮助,

Momergil

1 个答案:

答案 0 :(得分:1)

这是我在使用QT时遇到的问题。在运行qmake之前,任何具有Q_OBJECT宏的类必须在HEADERS中列出(据我所知)。这甚至可能意味着将.cpp文件放在HEADERS部分。