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

Langage C++ Discussion :

Constructeur avec paramètre objet par réference, et valeur par défaut


Sujet :

Langage C++

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 13
    Points
    13
    Par défaut Constructeur avec paramètre objet par réference, et valeur par défaut
    Juste une petite question/avis ...

    Pour mettre une valeur pas défaut dans un constructeur dans lequel je passe des objets j'ai fais ça, est ce que c'est bien ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MotorManagementSystem(Motor & motorLeft, Motor & motorRight, Counter & counterLeft = *(Counter*)0, Counter & counterRight = *(Counter*)0);
    ... ça me donne l'impression d'être du "bricolage", donc bon, je préfère être sûr... est ce que c'est bon ? ou pas ?

  2. #2
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Bon bah j'ai ma réponse, ça fonctionne pas ma solution ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Arduino : 1.5.7 (Mac OS X), Carte : "Arduino Uno"
     
    kiserary010002.ino:51:105: error: no matching function for call to 'MotorManagementSystem::MotorManagementSystem(Motor&, Motor&, Power, Counter (&)(), Counter (&)())'
    kiserary010002.ino:51:105: note: candidates are:
    In file included from kiserary010002.ino:12:0:
    MotorManagementSystem.h:13:5: note: MotorManagementSystem::MotorManagementSystem(Motor&, Motor&, Power, Counter&, Counter&)
         MotorManagementSystem(Motor & motorLeft, Motor & motorRight, Power power = OFF, Counter & counterLeft = *(Counter*)0, Counter & counterRight = *(Counter*)0);
         ^
    MotorManagementSystem.h:13:5: note:   no known conversion for argument 4 from 'Counter()' to 'Counter&'
    MotorManagementSystem.h:9:7: note: MotorManagementSystem::MotorManagementSystem(const MotorManagementSystem&)
     class MotorManagementSystem
           ^
    MotorManagementSystem.h:9:7: note:   candidate expects 1 argument, 5 provided
    Comment faire !?

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Pour moi c'est une erreur de logique
    Lorsqu'on préfère une référence (X&) à un pointeur (X*) c'est pour garantir de toujours avoir une valeur concrète.

    Une référence nulle Et une question: que se passe-t-il si tu utilises ta référence nulle?

  4. #4
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Bin, c'est un peu spécial de C++ de l'Arduino j'ai l'impression.


    Si je met ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MotorManagementSystem(Motor & motorLeft, Motor & motorRight, Power power = OFF, Counter & counterLeft = NULL, Counter & counterRight = null);
    ... ca marche pas non plus ...

    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
     
    Arduino : 1.5.7 (Mac OS X), Carte : "Arduino Uno"
     
    In file included from /Applications/Arduino.app/Contents/Java/hardware/tools/avr/avr/include/stdio.h:49:0,
                     from /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Print.h:24,
                     from /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Stream.h:26,
                     from /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/HardwareSerial.h:29,
                     from /Applications/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino/Arduino.h:221,
                     from Common.h:4,
                     from kiserary010002.ino:2:
    MotorManagementSystem.h:13:109: error: could not convert '0' from 'int' to 'Counter&'
         MotorManagementSystem(Motor & motorLeft, Motor & motorRight, Power power = OFF, Counter & counterLeft = NULL, Counter & counterRight = null);
                                                                                                                 ^
    In file included from kiserary010002.ino:12:0:
    MotorManagementSystem.h:13:140: error: 'null' was not declared in this scope
         MotorManagementSystem(Motor & motorLeft, Motor & motorRight, Power power = OFF, Counter & counterLeft = NULL, Counter & counterRight = null);
                                                                                                                                                ^
    kiserary010002.ino:51:105: error: no matching function for call to 'MotorManagementSystem::MotorManagementSystem(Motor&, Motor&, Power, Counter (&)(), Counter (&)())'
    kiserary010002.ino:51:105: note: candidates are:
    In file included from kiserary010002.ino:12:0:
    MotorManagementSystem.h:13:5: note: MotorManagementSystem::MotorManagementSystem(Motor&, Motor&, Power, Counter&, Counter&)
         MotorManagementSystem(Motor & motorLeft, Motor & motorRight, Power power = OFF, Counter & counterLeft = NULL, Counter & counterRight = null);
         ^
    MotorManagementSystem.h:13:5: note:   no known conversion for argument 4 from 'Counter()' to 'Counter&'
    MotorManagementSystem.h:9:7: note: MotorManagementSystem::MotorManagementSystem(const MotorManagementSystem&)
     class MotorManagementSystem
           ^
    MotorManagementSystem.h:9:7: note:   candidate expects 1 argument, 5 provided
     
      Ce rapport contiendrait plus d'informations si l'option
      "Montrer les informations de sortie pendant la compilation"
      était activée dans Fichier > Préférences.

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par moineauacoustic Voir le message
    Bin, c'est un peu spécial de C++ de l'Arduino j'ai l'impression.
    Et en quoi?
    Les erreurs sont très claires et en plus tu sembles convertir un pointeur de fonction en référence

    Citation Envoyé par moineauacoustic Voir le message
    error: could not convert '0' from 'int' to 'Counter&'
    Citation Envoyé par moineauacoustic Voir le message
    error: 'null' was not declared in this scope
    Citation Envoyé par moineauacoustic Voir le message
    note: no known conversion for argument 4 from 'Counter()' to 'Counter&'
    Pour le pointeur de fonction pourquoi ne pas passer en paramètre une énumération enum { FUNCTION_1 = 0, FUNCTION_2, FUNCTION_3 } et ensuite faire un switch pour appeler la bonne fonction

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    C'est un objet "Counter" que je veux passer en paramètre a mon constructeur, mais je veux qu'il soit optionnel et donc mettre un paramètre par défaut à "rien".

    Je n'ai pas de fonction ... ou alors j'ai pas compris un truc ?

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par moineauacoustic Voir le message
    C'est un objet "Counter" que je veux passer en paramètre a mon constructeur, mais je veux qu'il soit optionnel et donc mettre un paramètre par défaut à "rien".
    Et comment veut-savoir s'il est passé en paramètre ou pas?

    Citation Envoyé par moineauacoustic Voir le message
    Je n'ai pas de fonction ... ou alors j'ai pas compris un truc ?
    Et la surcharge cela te parle?

    MotorManagementSystem(/* all parameters */);

    MotorManagementSystem(/* all parameters */, Counter& c);
    Astuce: Dans la liste d'initialisation de ton constructeur qui prend en paramètre ton objet, tu peux appeler ton constructeur qui ne le prend pas

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Références et paramètres par défaut ne font pas bon ménage: Une référence doit toujours être valide, et l'objet référencé doit toujours avoir une durée de vie supérieure à la référence.
    Au pire, tu peux passer un objet compteur global ou static par défaut.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    Logiquement, objet référencé optionnel => pointeur (et test !=nullPtr avant utilisation), non?
    Comme le faisait remarquer foetus, une rérérence est censés TOUJOURS exister, non? prendre 0 pour initialiser une référence, c'est passer la corde à l'arbre et s'en faire une cravate, non?

  10. #10
    Membre à l'essai
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2006
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Novembre 2006
    Messages : 26
    Points : 13
    Points
    13
    Par défaut
    Au final j'ai pas trop trouvé de solution technique pour ce que je voulais faire, mais j'ai fait autrement ...

    Mais sinon, mon idée c'était d'avoir une classe "Controlleur de moteurs" qui prend en paramètre les moteurs, et aussi les compte-tour des roue, et rendre optionnel les comptes tour pour si on moteur (roue) en possède un ou pas. Certaines roue en on un, d'autre pas, et prévoir si j'en rajoute un, etc. ...

  11. #11
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 630
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 630
    Points : 10 556
    Points
    10 556
    Par défaut
    Citation Envoyé par moineauacoustic Voir le message
    Au final j'ai pas trop trouvé de solution technique pour ce que je voulais faire, mais j'ai fait autrement ...

    Mais sinon, mon idée c'était d'avoir une classe "Controlleur de moteurs" qui prend en paramètre les moteurs, et aussi les compte-tour des roue, et rendre optionnel les comptes tour pour si on moteur (roue) en possède un ou pas. Certaines roue en on un, d'autre pas, et prévoir si j'en rajoute un, etc. ...
    Et via l’encapsulation, mais il faut voir si cela ne fait pas trop de classes

    Pourquoi ne pas mettre le compte-tour (en utilisant soit la composition soit l'agrégation) dans le moteur et demander au moteur s'il a un compte-tour?

  12. #12
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Décembre 2010
    Messages
    734
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 734
    Points : 1 475
    Points
    1 475
    Par défaut
    moteur avec pointeur sur compte-tour. pointeur nullPtr si pas de compte-tour.
    le moteur expose bool hasCompteTour() const qui retourne true si pointeur renseigné, false si nullPtr.
    A toi de voir le comportement de double Moteur::nbTours() qui correspond le mieux à ton modèle dans le cas pas de compte-tour (retour NaN?)

Discussions similaires

  1. Singleton constructeur avec paramètres
    Par ancrou dans le forum Langage
    Réponses: 5
    Dernier message: 23/06/2009, 11h20
  2. [C#]Constructeur avec paramètre dans designer
    Par ClaudeBg dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/02/2009, 19h18
  3. [PHP 5.2] [POO] Constructeur avec paramètres et héritage
    Par yamayo dans le forum Langage
    Réponses: 4
    Dernier message: 11/01/2009, 20h40
  4. [Framework] [Core] bean et constructeur avec paramètre
    Par robert_trudel dans le forum Spring
    Réponses: 3
    Dernier message: 10/07/2008, 13h52
  5. [EJB Session] Constructeur avec paramètres ?
    Par DevTeam_ dans le forum Java EE
    Réponses: 23
    Dernier message: 07/05/2008, 12h07

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