2017-10-04 11 views
0

QtをC++で使用しようとしています。以前はPythonでプログラミングするためにQTを使っていました。Qtプロジェクトのフォワード宣言

私の簡単なテストは機能しません。これは私のtour.hファイルです:

#ifndef TOUR_H 
#define TOUR_H 

#include <QtWidgets/QMainWindow> 
#include <QtWidgets/QTableView> 

class TourTable; 

class Tour : public QMainWindow 
{ 
    Q_OBJECT 

public: 
    Tour(); 

/*protected: 
    void closeEvent(QCloseEvent *event); 

private slots: 
    void newCompetitor(); 
    void remCompetitor(); 
    void finalReport(); 
    void openPage(); 
    void savePage(); 
    void reloadTitle();*/ 

private: 
    TourTable _table; 

}; 

class QStandardItem; 
class QStandardItemModel; 

class TourTable : public QTableView 
{ 
    Q_OBJECT 

public: 
    TourTable(); 
/* bool isChanged(); 
    QString windowName(); 
    void finalReport(); 
    void newCompetitor(); 
    void remCompetitor(); 
    bool savePage(); 
    void setChanged(bool value); 
    void openPage();  

protected: 
    void itemChanged(QStandardItem item); 

private:*/ 
// bool _secondBetter(p1, p2); 

    Tour _parent; 
// QStandardItemModel _model; 
// bool _saved; 
// bool _changed; 

}; 

#endif 

私は問題を特定するために、このコードではほとんどすべてをコメントのだが、私はまだこれを引き起こしているのか分かりません。私の最初の試みはC++です。

エラーメッセージは次のとおりです。

tour.h:28:12: error: field ‘_table’ has incomplete type ‘TourTable’ 
    TourTable _table; 
      ^~~~~~ 
tour.h:7:7: note: forward declaration of ‘class TourTable’ 
class TourTable; 

誰かが私はそれを解決するために助けることができますか?

+0

あなたが同じファイルに 'TourTable'クラスを宣言しているので、'前方declaration'ための必要はありません、あなたは 'Tour'クラスを宣言する前に、' TourTable'をプッシュすることができます。 –

+0

TourTableクラスのTourリファレンスを持っているので、これはうまくいきません。 – demonplus

+1

あなたがする必要があるのは、TourTable * _tableを使用することです。後でcppファイル – demonplus

答えて

1

C++のフォワード宣言では、定義の前に型を参照できます。

class TourTable; 

class Tour : public QMainWindow 
{ 
    // ... 

    TourTable _table; 

}; 

あなたはTourTable _table;でそれをインスタンス化している、タイプTourTableを参照しているだけでなく、:ここでの問題は、あなたのコード内ということです。これには、TourTableの完全な定義が必要です。

ソリューションは、以下のように、TourTourTableを定義することができます

class TourTable : public QTableView 
{ 
    // ... 

    Tour _parent; 
} 

class Tour : public QMainWindow 
{ 
    // ... 

    TourTable _table; 
}; 

をしかし、それはちょうどあなたがTourTableTourをインスタンス化しているので、問題を移動します。

完全なデザインによっては、解決策がポインタを使用することがあります。そのような何か:

class TourTable; 

class Tour : public QMainWindow 
{ 
    Tour(); 
     // forward declaration of the constructor, 
     // see below for the definition 

    TourTable* _table; 
     // no complete definition of TourTable at this stage, 
     // only a forward declaration: 
     // we can only declare a pointer 
}; 

class TourTable : public QTableView 
{ 
    TourTable(Tour* parent): 
     QTableView(parent), 
     _parent(parent) 
    { 
    } 

    Tour* _parent; 
} 

Tour::Tour() // definition of Tour's constructor 
{ 
    _table = new TourTable(this); 
     // TourTable has been defined : we can instantiate it here 
} 
1

明らかに、このエラーはqmakeからではなく、コンパイラからのものであり、言語の制限です。しかし、親/子の動作を定義するクラスを作成し、QtのQObjectのように、その動作が基本クラスから継承されるクラスを作成することで、簡単に解決できます。

QMainWindowQTableViewの両方がQObjectから継承されていますので、QObjectの親子システムを使用すると、このデザインが冗長になることがあります。子供の電話parent()から親を見つけて、親から子供を見つけるには、children()と呼ぶことができます。

関連する問題