Bug de gcc ? (constructeur C++)

vinc1008881
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
- 3 sept. 2008 à 14:52
theneoiceman
Messages postés
78
Date d'inscription
lundi 14 avril 2003
Statut
Membre
Dernière intervention
23 avril 2010
- 12 sept. 2008 à 14:06
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

fregolo52
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
3
3 sept. 2008 à 15:01
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.
0
vinc1008881
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
3 sept. 2008 à 15:21
oui, je comprend mais comment fait-on pour passer l'objet en argument ?
0
fregolo52
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
3
3 sept. 2008 à 15:36
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
0
vinc1008881
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
3 sept. 2008 à 15:50
ok, je suis d'accord mais je comprend toujours pas pourquoi

line.init(point, point)

marche ? C'est le même problème non ?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fregolo52
Messages postés
1115
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
6 mai 2021
3
3 sept. 2008 à 16:20
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.
0
vinc1008881
Messages postés
257
Date d'inscription
dimanche 22 août 2004
Statut
Membre
Dernière intervention
29 septembre 2010
3
3 sept. 2008 à 20:10
bizarre j'ai rajouté dans la classe point le constructeur par défaut point(){} et ça marche maintenant, je voudrais bien savoir POURQUOI
0
theneoiceman
Messages postés
78
Date d'inscription
lundi 14 avril 2003
Statut
Membre
Dernière intervention
23 avril 2010

12 sept. 2008 à 14:06
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
0