繁体   English   中英

Qt转发声明会产生错误

[英]Qt forward declaration generates error

当编写类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 ,那么您仍然会遇到类似的问题。

如果出现类似以下错误:

“类别”未命名类型

您应该知道QT的商标为“ QT_FORWARD_DECLARE_CLASS”。

这意味着您可以在头文件中举例说:

QT_FORWARD_DECLARE_CLASS(QObject);

或您要转发的任何其他类在头文件中声明。 可能在.cpp文件中,您也想包含该类/头文件。 因为您想要例如创建课程的实例。

在另一个头文件中,您可以仅使用头文件中的include。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM