Bug de gcc ? (constructeur C++)

Signaler
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
-
Messages postés
78
Date d'inscription
lundi 14 avril 2003
Statut
Membre
Dernière intervention
23 avril 2010
-
Bonjour, je rencontre un problème de constructeur avec gcc, à n'y rien comprendre :

J'ai :

class point{
public :
point (int, int, int); //constructeur
....
};

et

class ligne{
public :
ligne (point p1, point p2); //constructeur
void set (point p1, point p2); //méthode d'initialisation
....
};

void ligne::set(point p1, point p2) {........}

compile bien mais

ligne::ligne (point p1, point p2) {......}

compile pas : gcc me lance "no match for point::point()" ???

Pourtant, c'est pareil, ce sont deux méthodes non ?

Merci

7 réponses

Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
Je ne suis pas un bête en C++ mais c'est explicite, tu n'as pas de constructeur par défaut.

Je pense que tu dois passer en paramètre des pointeurs.

Tes appels instancient la classe 'point' et vu que tu n'as pas de constructeur par défaut ça plante.
Je pense que si tu fais :
int main(void)
{
  point pt;
  return 0;
}

tu as la même erreur. Ca vient pas du constructeur de ligne.


Et je pense que Visual c++ te ferait la meme erreur.
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
oui, je comprend mais comment fait-on pour passer l'objet en argument ?
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
je ne sais pas ce que tu fais dans ligne.cpp mais pourquoi ne pourrais-tu pas faire :



class ligne{
public :
ligne (point *p1, point *p2); //constructeur
void set (point p1, point p2); //méthode d'initialisation

....
};

ou

class ligne{
public :
ligne (); //constructeur
void set (point p1, point p2); //méthode d'initialisation
....
};
Vu que tu as une méthode d'init
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
ok, je suis d'accord mais je comprend toujours pas pourquoi

line.init(point, point)

marche ? C'est le même problème non ?
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
Oui en effet, là je pense que je n'ai pas de réponse, il faut qu'un expérienté en la matière réponde, il doit y avoir une subtilité avec les constructeurs.
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
bizarre j'ai rajouté dans la classe point le constructeur par défaut point(){} et ça marche maintenant, je voudrais bien savoir POURQUOI
Messages postés
78
Date d'inscription
lundi 14 avril 2003
Statut
Membre
Dernière intervention
23 avril 2010

Je pense que ton problème réside dans le fait que je suppose que ta classe "ligne" possède 2 variables membres pour représenter ses 2 coordonnées, du genre ca :

class ligne{

point m_p1;
point m_p2;

public :
ligne (point p1, point p2); //constructeur
void set (point p1, point p2); //méthode d'initialisation
....
};

Evidemment lors de l'appel à ton constructeur ligne::ligne(point p1, point p2) qui construit une instance de ta classe "ligne", les variables membres de l'instance sont elles aussi créées, donc m_p1 et m_p2 sont construites avec leur constructeur par défaut point() qui, dans ton cas , n'existe pas puisque tu as défini ton propre constructeur de "point".

L'ajout du constructeur point() sans paramètres dans ta classe "point" a permis de régler le problème, voila l'explication ^^

En espérant avoir été clair :p

A pluche

Mess with the best, die like the rest