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 :

[debutant]passer un objet par const reference


Sujet :

C++

  1. #1
    Battosaiii
    Invité(e)
    Par défaut [debutant]passer un objet par const reference
    Je voudrais passer un objet par const reference dans une methode :
    J'ai tente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void plane::arfoob(temps const& tt)
    {
    	tt.weather();
    }
    il me dit en warning :

    Warning W8037 plane.cpp 125: Non-const function temps::weather() called for cons
    t object in function plane::arfoob(const temps &)

    On doit appeller des fonctions const lorsque on passe par reference un objet dans une methode ?

    dans le main :

    plane *p5=new plane();
    p5->arfoob(t);

    Quand je compile ca marche mais je suis pas sur de l'utilisation de const par reference . L'utilite c'est bien de faire en sorte qu'une variable reste constante meme apres la modification de la variable dans une fonction ?

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    On doit appeller des fonctions const lorsque on passe par reference un objet dans une methode ?
    Ce n'est pas tant le fait que tu passes une référence, mais surtout le fait que tu passes une référence constante. Donc oui, tu ne peux appeler que des fonctions constantes sur ces objet.

    L'utilite c'est bien de faire en sorte qu'une variable reste constante meme apres la modification de la variable dans une fonction ?
    L'utilité est de s'assurer que la fonction ne pourra pas modifier son paramètre. D'où ton erreur.

  3. #3
    Battosaiii
    Invité(e)
    Par défaut
    je recapitule :

    Il faut que la fonction soit constante et pour utiliser le const comme parametre ?

    Donc dans mon exemple il faut que je definisse weather de cette facon :

    void const weather() {...}
    pour que ce soit valable ?

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    je dirais plutôt:
    void temps::weather() const { blabla }

  5. #5
    Battosaiii
    Invité(e)
    Par défaut
    ok ca marche .
    Simple question j'avais mis auparavant virtual devant weather et il m'a repondu :

    Warning W8022 sky.h 23: 'sky::weather()' hides virtual function 'temps::weather(
    ) const'

    Je l'interprete comme ceci : on ne peut pas utiliser virtual dans une fonction const car une fonction virtual est amener a etre modifier dans ces classes filles. or il y a contradiction avec const. car const sert a rendre une fonction constante b.
    Est ce vrai ?

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    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 379
    Points : 41 573
    Points
    41 573
    Par défaut
    c'est complètement faux.

    D'ailleurs, tu peux déclarer la seconde en virtual...

    Je crois bien que tu as généralement ce genre d'avertissement quand tu déclares dans la classe fille une fonction du même nom que la fonction virtual de la classe mère, mais que la fonction de la fille n'est pas déclarée virtual: Le compilo te signale que la fonction est virtual bien qu'on ait oublié de le préciser, ou bien d'autres avertissements voisins...

  7. #7
    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
    Points : 16 213
    Points
    16 213
    Par défaut
    Non.

    Const indique seulement qu'une fonction ne va pas modifier les données membre d'une classe, aucun rapport avec le fait qu'elle puisse être redéfinie ou pas.

    Le problème est que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    void weather() const
    void weather()
    représentent deux fonctions totalement différentes, mais qui ont le même nom. Dans ce cas là, la fonction de la classe dérivée ne redéfinie pas la fonction de la classe mère, elle la cache : Depuis un pointeur sur la classe dérivée, seule une des fonction est visible et appelabe, depuis un pointeur sur la classe mère, seule l'autre fonction est visible et appelable. Il n'y a pas alors de mécanisme virtuel.

    La solution est simple : Quand on veut redéfinir une fonction virtuelle, il faut qu'elle est exactement le même prototype (*) que dans la classe de base, y compris le fait qu'elle soit const ou pas.

    (*) Sauf pour la cas des retours covariants, mais ne compliquons pas le sujet...

Discussions similaires

  1. [MVVM] Passer un objet par la messagerie
    Par DotNET74 dans le forum Windows Phone
    Réponses: 3
    Dernier message: 31/05/2011, 16h38
  2. Passer un objet par valeur et non référence
    Par Pynouz dans le forum C#
    Réponses: 2
    Dernier message: 14/01/2011, 09h42
  3. Réponses: 9
    Dernier message: 09/12/2010, 16h33
  4. passer un objet par reference a bindingsource.add()
    Par ZashOne dans le forum Framework .NET
    Réponses: 5
    Dernier message: 01/04/2008, 18h09
  5. [JACOB] Comment passer un objet par référence à une méthode
    Par zlavock dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 21/03/2005, 18h28

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