2010-04-20 6 views
0

J'aiQt « pas de fonction correspondant pour l'appel »

no matching function for call to 'saveLine::saveLine()' 

erreur lors de la compilation de ma demande. Le constructeur n'est jamais réellement appelé.

définition de la classe Savéline:

class saveLine 
{ 
public: 
    saveLine(QWidget *parent); 
private: 
    QPushButton *selectButton, *acceptButton; 
    QLabel *filePath; 
    QLineEdit *allias; 
}; 

Savéline est utilisé dans une autre classe qui est définie comme suit:

class MWindow : public QWidget 
{ 
    Q_OBJECT 
public: 
    MWindow(QWidget *parent=0); 
private: 
    saveLine line1; 
}; 

points d'erreur pour MWindow implémentation du constructeur

MWindow::MWindow(QWidget *parent):QWidget(parent) 
{ 
    this->setWindowTitle("Launcher"); 
    this->resize(600,600); 
} 

Que dois-je faire? J'ai l'intention d'utiliser la classe saveLine dans un vecteur, pour créer des lignes à l'exécution.

EDIT: Je l'ai mal déclarées ligne1, il faut lire

saveLine *line1; 

mais maintenant il donne une autre erreur

ISO C++ forbids declaration of 'saveLine' with no type 

et

expected ';' before '*' token 

sur cette ligne. Il semble que saveLine n'est plus considéré comme une classe, comment?

Répondre

1

mais maintenant il donne une autre erreur

ISO C++ interdit la déclaration de « Savéline » sans type

Vous devez ajouter une déclaration avant de dire au compilateur qui existe classe Savéline:

Comme ceci:

//declare that there will be a class saveLine 
class saveLine; 

class MWindow : public QWidget 
{ 
    Q_OBJECT 
public: 
    MWindow(QWidget *parent=0); 
private: 
    saveLine *line1; 
}; 
5

Étant donné que vous fournissez un constructeur déclaré par l'utilisateur pour la classe saveLine, le constructeur par défaut n'est pas fourni par le compilateur. Votre constructeur n'est pas un constructeur par défaut (il a un paramètre requis), donc vous ne pouvez pas construire par défaut un objet de type saveLine.

Puisque vous avez un objet saveLine dans votre MWindow classe, vous devez l'initialiser en utilisant votre constructeur, dans la liste des initialiseur du constructeur MWindow:

MWindow::MWindow(QWidget *parent) 
    : QWidget(parent), line1(parent) 
{ 
    //... 
} 

(je suppose que le pointeur de parent est celui que vous signifie passer, si vous avez besoin de lui donner quelque chose d'autre, puis de lui donner ce dont il a besoin)

une autre option serait de fournir un argument par défaut pour le paramètre dans le constructeur de saveLine:

saveLine(QWidget *parent = 0); 

Cela permettrait à ce constructeur d'être appelé sans argument (et en ferait un constructeur par défaut). Cela dépend si le pointeur parent est réellement facultatif. Évidemment, si vous faites cela, vous devrez vérifier que le pointeur n'est pas nul avant de le déréférencer et de l'utiliser.

+0

Minor nit: Vous devez passer 'this' au lieu de' parent' à 'line1()'. – Bill

+0

Je l'ai fait, ça n'a pas aidé. – Blin

+0

Bon point - indique toujours votre propre constructeur par défaut en plus des constructeurs surchargés. – RooiWillie

1

Vous devez appeler le constructeur de saveLine dans le constructeur de MWindow en lui donnant le parent désiré.

Utilisation:

MWindow::MWindow(QWidget *parent) : QWidget(parent), line1(parent) 
{ 
    this->setWindowTitle("Launcher"); 
    this->resize(600,600); 
} 
0

Vous déclarez une instance de Savéline dans la déclaration de classe, au lieu d'un pointeur vers un Savéline.

Vous pouvez changer la référence en MWindow à

saveLine* line1; 

OU

vous pouvez mettre en œuvre comme ceci:

MWindow::MWindow(QWidget *parent):QWidget(parent), line1(parent) 
{ 
    this->setWindowTitle("Launcher"); 
    this->resize(600,600); 
} 
+0

À quoi cela est-il destiné? – CDSO1

+0

Je me demande aussi, j'ai en effet oublié d'utiliser un pointeur. Bien que le compilateur ait maintenant une erreur différente "ISO C++ interdit la déclaration de 'saveLine' sans type" et "expected ';' avant le jeton "*" " – Blin

+0

Votre directive #include vous manque peut-être? – CDSO1

0

Essayez d'ajouter class saveLine; juste au-dessus du class MWindow ligne. Cela se produit souvent lorsque les fichiers .h pour la classe saveLine et la classe MWindow sont inclus (directement ou indirectement). Par exemple, voir les premiers messages de http://www.allegro.cc/forums/thread/594307

Questions connexes