Qt正向声明生成错误

Qt forward declaration generates error

本文关键字:错误 声明 Qt      更新时间:2023-10-16

编写类TemplateHandler时,假设我使用TemplateHandler.h(用于标头)和TemplateHandler.cpp(用于声明)。像

// Templatehandler.h
#ifndef TEMPLATEHANDLER_H
#define TEMPLATEHANDLER_H
#include <QObject>   // Forward declaration of QObject generates error
class QListView;     // Forward declarations
class QTextEdit;
class QModelIndex;
class QStringListModel;
class TemplateHandler : public QObject
{
  Q_OBJECT
  public:
    TemplateHandler(QListView *view, QTextEdit *textEdit, QObject *parent);
    virtual ~TemplateHandler();
  private:
    QTextEdit *mTextEdit;
    QStringListModel *mModel;
};
#endif

和源

#include "templatehandler.h"
#include <QListView>             // Inclusion of lib
#include <QTextEdit>
#include <QObject>
#include <QStringListModel>
TemplateHandler::TemplateHandler(QListView *view, QTextEdit *textEdit, QObject *parent) : QObject(parent), mTextEdit(textEdit)
{
    mModel = new QStringListModel(this);
    QStringList templates;
    templates << "<html>" << "</html>" << "<body>" << "</body>";
    mModel->setStringList(templates);
    view->setModel(mModel);
    connect(view, SIGNAL(clicked(const QModelIndex&)), SLOT(insertText(const QModelIndex&)));
}
TemplateHandler::~TemplateHandler() {
    // TODO Auto-generated destructor stub
}

但是在这种情况下,QObject的前向声明会生成错误,但是其余的都是可以的。我需要一些帮助。

这是一个纯粹的c++"问题"。

只有当编译器在包含标头时不需要类的大小时,正向声明才起作用。例如,对于指针,甚至对于类,它都知道大小。

另一方面,对于在堆栈上创建的对象或父类,它需要知道结构的确切大小(例如sizeof(QObject)),而只有通过包含.h才能获得。

您是从QObject继承的,向基类转发声明是不起作用的。这是因为当从继承类时,编译器需要知道类的大小,正如Koying所提到的,这需要包括.h文件。

在所有其他情况下,都使用指向前向声明类的指针。指针只不过是内存地址,不需要知道类的整个大小,因为指向它的指针的大小只是存储内存地址所需的大小(取决于体系结构、平台等)。如果你尝试创建像QListView listView而不是QListView* listView这样的成员,那么你仍然会面临类似的问题。