Объявление Qt forward генерирует ошибку - PullRequest
0 голосов
/ 14 марта 2012

При написании класса 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 генерирует ошибку, однако все остальное окей.Мне нужна помощь в этом.

Ответы [ 3 ]

8 голосов
/ 14 марта 2012

Это чисто проблема с ++.

Форвардные объявления работают только тогда, когда компилятору не нужен размер класса во время включения заголовка.Например, для указателей, даже для класса, он знает размер.

С другой стороны, для объекта, созданного в стеке, или для родительских классов, он должен знать точный размер структуры (например, sizeof(QObject)), которую он может получить, включив .h.

3 голосов
/ 14 марта 2012

Вы наследуете от QObject, и переадресация объявлений в базовый класс не работает. Это связано с тем, что когда класс наследуется, компилятору необходимо знать размер класса, который, как упоминалось Koying , требует включения файла .h.

Во всех других случаях вы используете указатели на объявленные вперед классы. Указатели, являющиеся ничем иным, как адресами памяти, не должны знать весь размер класса, поскольку размер указателя на него будет просто размером, необходимым для хранения адреса памяти (в зависимости от архитектуры, платформы и т. Д.). Если бы вы попытались сделать члена вроде QListView listView вместо QListView* listView, то вы все равно столкнулись бы с подобными проблемами.

2 голосов
/ 10 сентября 2014

Если вы получили ошибку типа:

«Класс» не называет тип

Вы должны знать, что QT имеет марку под названием 'QT_FORWARD_DECLARE_CLASS'.

Значение, которое вы можете сказать в заголовочном файле, например:

QT_FORWARD_DECLARE_CLASS(QObject);

Или любой другой класс, который вы хотите переслать объявить в заголовочном файле. Вероятно, в файл .cpp вы также хотите включить этот файл класса / заголовка. Потому что вы хотите, например, создание мгновенного класса.

В другом заголовочном файле вы можете просто использовать include в заголовочном файле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...