2017-10-04 2 views
0

J'essaie d'utiliser Qt avec C++. J'utiliserais QT pour programmer en Python avant.Déclaration en avant dans le projet Qt

mon test simple ne fonctionne pas. Ceci est mon fichier 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 

je l'avais fait remarquer presque tout dans ce code pour isoler le problème, mais je ne sais toujours pas ce qui cause cela. C'est mon premier essai en C++.

Le message d'erreur est:

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; 

quelqu'un peut me aider à résoudre cela?

+0

Puisque vous déclarant 'classe TourTable' dans un même fichier il n'y a pas besoin de' declaration' avant, vous pouvez pousser 'TourTable' avant de déclarer la classe' Tour'. –

+0

Cela ne fonctionnera pas car il a une référence Tour dans la classe TourTable – demonplus

+1

Ce que vous devez faire est d'utiliser TourTable * _table; Vous serez en mesure de construire l'objet plus tard dans le fichier cpp – demonplus

Répondre

1

La déclaration anticipée en C++ permet de référencer un type avant sa définition. Le problème est ici que dans votre code:

class TourTable; 

class Tour : public QMainWindow 
{ 
    // ... 

    TourTable _table; 

}; 

Vous faites référence non seulement le type TourTable, vous instanciation avec TourTable _table;. Cela nécessite une définition complète de TourTable.

Une solution pourrait consister à définir TourTable avant Tour, comme suit:

class TourTable : public QTableView 
{ 
    // ... 

    Tour _parent; 
} 

class Tour : public QMainWindow 
{ 
    // ... 

    TourTable _table; 
}; 

Mais qui vient déplace le problème puisque vous instanciation Tour à TourTable.

Selon la conception complète, la solution peut être d'utiliser des pointeurs. Quelque chose comme ça:

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

Pour être clair, cette erreur provient de votre compilateur - pas de qmake - et est une limitation de la langue. Mais il peut être facilement surmonté en créant une classe qui définit un comportement parent/enfant et en faisant des classes où vous voulez que ce comportement hérite de la classe de base, comme le fait Qt's QObject.

Les deux QMainWindow et QTableView Hériter de QObject, donc si vous utilisez des parents de QObject/système d'enfant cette conception peut être redondante. Pour rechercher le parent auprès de l'enfant, appelez le parent() et pour rechercher les enfants auprès du parent, appelez le children().