2012-03-14 160 views
0

写入类TemplateHandler时,说我使用TemplateHandler.h(用于我的头)和TemplateHandler.cpp(用于声明)。像Qt前向声明产生错误

// 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的向前声明产生误差的来源,但其余的都是好。我需要一些帮助。

+0

哪个错误? – UmNyobe 2012-03-14 09:40:15

回答

8

这是一个纯粹的C++“问题”。

只有当编译器在包含标题时不需要该类的大小时,才能使用正向声明。例如。对于指针,即使是上课,它也知道大小。

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

+0

什么'.h'文件? – khaverim 2017-08-11 04:18:07

3

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

在所有其他情况下,您使用指向前向声明的类的指针。指针只是内存地址,不需要知道整个类的大小,因为指向它的指针的大小将只是存储内存地址所需的大小(取决于体系结构,平台等)。如果您尝试制作QListView listView而不是QListView* listView,那么您仍然会遇到类似的问题。

2

如果你有这样的错误:

“类”没有指定类型

你应该知道,QT有一个名为“QT_FORWARD_DECLARE_CLASS”马可。

这意味着你可以在例如头文件说:

QT_FORWARD_DECLARE_CLASS(QObject); 

还是要转发在头文件中声明任何其他类。可能在.cpp文件中,你也想包含这个类/头文件。因为你想要创造一个类的瞬间。

在其他头文件中,您可以在头文件中使用include。