[英]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.