IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème de constructeur


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 130
    Par défaut Problème de constructeur
    Bonjour
    Le programme fonctionne sans constructeur mais pourquoi lorsque j'en indique un (constructeur point) il positionne l'erreur suivante ligne 30

    invalid fonction 'int main()'
    no matching function for call 'point::point()'
    note candidates are point::point (const point&)
    point::point (int int)

    .......... Merci ............

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <iostream>
    #include <stdlib.h>
    using namespace std;
    class point
    { 
      public:     
           int x;
           int y;
          point (int,int);
           void initialise (int, int);
           void deplace (int, int);
           void affiche ();
    };
    void point :: initialise (int abs, int ord)
     {      x = abs ; y = ord;
    }
    point::point (int i, int j)
    { x = i +10;
      y = j + 10;
    }
    void point :: deplace (int dx, int dy)
    {
         x  +=dx;
         y  += dy;
    }
    void point :: affiche ()
    {    cout << "Je suis en  "  << x << " " << y << "\n";
    }
    main ()
    {   point a, b, c; //ligne 30
     
        a.point (8, 9);
         a.initialise (5, 2); a.affiche ();
        a.deplace (-2, 4); a.affiche ();
       /* b.initialise (1, -1) ; b.affiche ();
       c.initialise (60, 2); c.affiche ();
         c.deplace (-2, 4); c.affiche ();
         c.initialise (1, -1) ; c.affiche ();
         a.initialise (5, 2); a.affiche ();*/
         system("PAUSE");
         }

  2. #2
    Membre expérimenté Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Par défaut
    Salut,
    Il me semble que du moment que tu définis un constructeur quelconque, tu dois également définir un constructeur par défaut remplaçant celui automatiquement généré par le compilateur.

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Si tu ne définis aucun constructeru, il en défini un par défaut, ne prenant aucun argument. C'est celui là qui était utilisé ligne 30. A partir du moment où tu en as défini un, il n'a plus le droit d'en définir un par défaut. Si tu veux retrouver le bon comportement ligne 30, à toi de définir manuellement un constructeur par défaut pour ton type.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 130
    Par défaut
    Certes mais j'ai du mal comprendre "comment créer un constructeur" car je pensais avec "point" avoir "fabriqué" un constructeur indiquant
    .......... Merci ........
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public:     
           int x;
           int y;
          point (int,int);
           void initialise (int, int);
           void deplace (int, int);
           void affiche ();
    };
    void point :: initialise (int abs, int ord)
     {      x = abs ; y = ord;
    }
    point::point (int i, int j)
    { x = i +10;
      y = j + 10;
    }

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 288
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    Citation Envoyé par tom31 Voir le message
    je pensais avec "point" avoir "fabriqué" un constructeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    point::point (int i, int j)
    { x = i +10;
      y = j + 10;
    }
    Effectivement, là tu crées un constructeur, mais ce n'est pas le constructeur par défaut. Le constructeur par défaut ne prend aucun argument. Et quand tu déclare un point sur la pile comme suit:
    le compilateur a besoin du constructeur par défaut pour construire a.

    En c++, une classe peu posséder n constructeurs, mais qu'un seul constructeur par défaut.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 130
    Par défaut
    Je vous remercie. Je viens de faire un petit pas supplémentaire !!!!!!!!!

  7. #7
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Tu peux quand même réaliser un constructeur qui prend des paramètres mais dans ce cas il faut que tu donnes des valeurs par défaut pour chacun des paramètres.

    Tu peux également faire une classe qui ne possède pas de constructeur par défaut, mais dans ce cas il ne te sera possible de déclarer uniquement des pointeurs sur ta classe, car quand tu déclares :
    lors de l'éxécution du code, le constructeur de point est appelé.

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    1 415
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2007
    Messages : 1 415
    Par défaut
    Salut

    Solution 1:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    struct Point
    {
    	int x, y;
    	Point();
    	Point(int x_init, int y_init);
    };
     
    Point::Point() : x(0), y(0)
    {}
     
    Point::Point(int x_init, int y_init) : x(x_init), y(y_init)
    {}
     
    int main()
    {
    	Point a;
    	Point b(1,2);
    	return 0;
    }
    Solution 2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    struct Point
    {
    	int x, y;
    	Point(int x_init = 0, int y_init = 0);
    };
     
    Point::Point(int x_init, int y_init) : x(x_init), y(y_init)
    {}
     
    int main()
    {
    	Point a;
    	Point b(1,2);
    	return 0;
    }
    Je préfère la solution 1. La solution 2 est plus compacte en code mais autorise la syntaxe Point a(12); qui n'a pas un sens très clair.

Discussions similaires

  1. problème de constructeur avec wxWidget
    Par Ardeciel dans le forum wxWidgets
    Réponses: 2
    Dernier message: 10/03/2007, 23h11
  2. Problème définition constructeur
    Par bugland dans le forum Langage
    Réponses: 11
    Dernier message: 12/02/2007, 14h34
  3. Problème de constructeur de copie ?
    Par Bestiol dans le forum C++
    Réponses: 6
    Dernier message: 03/11/2006, 11h28
  4. [POO]Probléme de constructeur virtuel surchargé
    Par Laurent Dardenne dans le forum Delphi
    Réponses: 10
    Dernier message: 15/08/2006, 12h19
  5. [C#] DLL, problème de constructeur
    Par gmonta dans le forum C#
    Réponses: 4
    Dernier message: 30/11/2005, 09h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo