如何在头文件中声明一个新类并在源文件中定义它而不会出现这种错误

How to declare a new class in the header and define it in the source file without this errors?

本文关键字:定义 错误 源文件 新类 声明 文件 一个      更新时间:2023-10-16

我的情况是,我想创建一个新类,然后在另一个创建的类(c++)中使用它,但不使用不同的头文件或源文件:两个类都应该在同一个地方,这样或那样。主类只能包含一个指向"子"类的指针。

现在我知道,在许多情况下,在头文件中定义一个类是完全可能的。事实上,如果一个人想要的不仅仅是一个指向"子类"的指针,而是实际使用头文件中已经存在的一个方法(例如,对于内联方法),他实际上必须在源文件中定义它:

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

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

//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
//...

那么问题是什么呢?我得到这个"对'虚表'的未定义引用"问题是什么?

谢谢你的帮助,

Momergil

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