Qt前向声明会产生错误

时间:2012-03-14 09:37:08

标签: c++ qt qt4

在编写类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 的前向声明会产生错误,但其余的都是okey。我需要一些帮助。

3 个答案:

答案 0 :(得分:8)

这是纯粹的c ++“问题”。

前向声明仅在编译器在包含标头时不需要类的大小时才有效。例如。对于指针,即使是上课,也知道它的大小。

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

如果您收到如下错误:

  

'Class'没有命名类型

你应该知道QT有一个名为'QT_FORWARD_DECLARE_CLASS'的marco。

您可以在头文件中说明例如:

QT_FORWARD_DECLARE_CLASS(QObject);

或者您要转发的任何其他类在头文件中声明。可能在.cpp文件中,您还希望包含此类/头文件。因为你想要,例如创造一个班级的瞬间。

在另一个头文件中,您只需使用头文件中的include即可。