2012-03-14 13 views
0

TemplateHandlerクラスを書き込むときに、私はTemplateHandler.h(ヘッダ用)とTemplateHandler.cpp(宣言用)を使用します。同様Qt forward宣言でエラーが発生する

// 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

答えて

8

これは純粋なC++の「問題」です。

フォワード宣言は、ヘッダーが含まれているときにコンパイラがクラスのサイズを必要としない場合にのみ機能します。例えば。ポインタのために、クラスにも、それはサイズを知っている。

一方、スタックまたは親クラス用に作成されたオブジェクトの場合は、構造体の正確なサイズ(たとえばsizeof(QObject))を知る必要があります。.hを含めることによってのみ取得できます。

+0

'.h'ファイルは何ですか? – khaverim

3

QObjectから継承しており、基本クラスへの前方宣言は機能しません。これは、クラスが継承されるとき、コンパイラは、Koyingとして、.hファイルを含める必要があるクラスのサイズを知る必要があるからです。

それ以外の場合は、前方宣言されたクラスへのポインタを使用します。ポインターはメモリアドレス以外のもので、クラスの全体のサイズを知る必要はありません。ポインタのサイズはメモリアドレスを格納するのに必要なサイズにすぎません(アーキテクチャ、プラットフォームなどによる)。 QListView* listViewの代わりにQListView listViewのようなメンバーを作成しようとすると、同様の問題に直面します。

2

あなたのようなエラーを得た場合:

「クラス」をあなたはQTが「QT_FORWARD_DECLARE_CLASS」と呼ばれるマルコを持っていることを知るべきであるタイプ

に名前を付けていません。

QT_FORWARD_DECLARE_CLASS(QObject); 

それとも他のクラスあなたはヘッダファイルに宣言を転送したい:あなたはたとえば、ヘッダファイルに言うことができることを意味し

。おそらく.cppファイルにもこのクラス/ヘッダーファイルを含める必要があります。たとえば、クラスのインスタントを作成します。

他のヘッダーファイルでは、ヘッダーファイルにインクルードを使用できます。

関連する問題