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 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
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 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
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 1114 Date d'inscription mercredi 15 juin 2011 Statut Membre Dernière intervention 6 mai 2021 4
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
Rejoignez-nous