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 :

[Débutant] erreur de l-value


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut [Débutant] erreur de l-value
    Bonjour,

    J'ai un petit problème avec comme message d'erreur : '&' nécessite une l-value

    Explication du code :

    J'ai une classe Point (dans un namespace dom).
    Cette classe contient un x et un y.

    J'ai maintenant une classe _non membre_ echange() qui doit échanger les valeurs de x et y.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void echange(int* x, int* y){
    	int temp = *x;
    	*x = *y;
    	*y = temp;
    } // end echange()

    Dans mon main, lorsque que j'utilise ma fonction non membre echanger(), j'obtiens l'erreur !!!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    point monPoint = point();
    echange(&monPoint.get_x(),&monPoint.get_y()); // erreur: '&' nécessite une l-value
    J'ai également essayer comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int* ptr_x = &monPoint.get_x(); // erreur: '&' nécessite une l-value
    int* ptr_y = &monPoint.get_y(); // erreur: '&' nécessite une l-value
    echange(ptr_x,ptr_y);
    Mais je n'ai pas eu plus de chance ...

    Pouvez-vous m'aidre?

  2. #2
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Pourrais-tu nous montrer ta classe et le message d'erreur?
    Les as-tu déclaré en public, private,etc?

  3. #3
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    Ma classe est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    namespace dom {
    	class point {
    	private :
    		int _x;
    		int _y;
     
    	public :
    		void set_x(int);
    		void set_y(int);
    		int get_x();
    		int get_y();
    	}; // end class
    } // end namespace

    Ensuite j'ai déclaré mes fonctions membres et ma fonction non membre (qui est ni en privée, ni en publique, ni en statique car elle est non membre) et ensuite mon main() ou j'utilise mes fonctions ...

    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
    int main(){
    	using namespace dom;
    	int* ptr_x;
    	int* ptr_y;
     
    	point monPoint = point();
    	monPoint.set_x(2);
    	monPoint.set_y(7);
    	std::cout << "x=" << monPoint.get_x() << " , y=" << monPoint.get_y() << std::endl;
     
    	ptr_x = &monPoint.get_x(); // erreur: '&' nécessite une l-value 
    	ptr_y = &monPoint.get_y(); // erreur: '&' nécessite une l-value 
    	echange(ptr_x,ptr_y);
    	//echange(&monPoint.get_x(),&monPoint.get_y()); // ou alors erreur: '&' nécessite une l-value 
     
    	std::cout << "x=" << monPoint.get_x() << " , y=" << monPoint.get_y() << std::endl;
    	return 0;
    } // end main()

  4. #4
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par LaseLiep
    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
    int main(){
    	using namespace dom;
    	int* ptr_x;
    	int* ptr_y;
     
    	point monPoint = point();
    	monPoint.set_x(2);
    	monPoint.set_y(7);
    	std::cout << "x=" << monPoint.get_x() << " , y=" << monPoint.get_y() << std::endl;
     
    	ptr_x = &monPoint.get_x(); // erreur: '&' nécessite une l-value 
    	ptr_y = &monPoint.get_y(); // erreur: '&' nécessite une l-value 
    	echange(ptr_x,ptr_y);
    	//echange(&monPoint.get_x(),&monPoint.get_y()); // ou alors erreur: '&' nécessite une l-value 
     
    	std::cout << "x=" << monPoint.get_x() << " , y=" << monPoint.get_y() << std::endl;
    	return 0;
    } // end main()
    get_x et y renvoient une "valeur" (i.e. une Constante). tu ne peux pas faire de référence vers des Constantes, mais uniquement vers des Variables (i.e. int Z est une variable) qu'elles soient constantes ou non.

    pour faire ce que tu essaies là, il faudrait que get_x et y renvoie une référence vers les données de ton objet.

  5. #5
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    hmm comme c'est pas forcément évident à voir, un exemple

    toi tu fais l'équivalent de
    or une constante n'a pas d'adresse (il n'y a pas d'espace alloué)

    pour y remédier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int & get() { return a; }
     
    ptr = &toto.get(); // équivaut à ptr = &toto.a; (quand a est public)

  6. #6
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    bigboomshakala :
    Est-ce que ca change quelquechose si a est protected ou private ?
    J'ai l'habitude de renvoyer des pointeurs sur des membres protected ou private, c'est mal ?

  7. #7
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    J'te remercie, en effet ma fonction marche maintenant, mais je ne comprends po pourquoi.

    Je n'ai jamais vu de fonction qui renvoyer Type & fonction(). Cela signifie que si par exemple je veux que ma fonction retourne une adresse sur un int, je lui fait retourner juste son int, mais qu'ensuite dans le type de retour, je lui demande l'adresse de ce int? Et c'est en mettant int& que je peux avoir cela ???

    Et dans ce bout de code :
    Mon get() me renvoie déjà une adresse, donc pourquoi si j'ai l'adresse de mon x (appartenant à l'objet toto) je redemande encore une adresse ???


    Merci pour ton aide.

  8. #8
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par titoine1978
    bigboomshakala :
    Est-ce que ca change quelquechose si a est protected ou private ?
    non
    Citation Envoyé par titoine1978
    J'ai l'habitude de renvoyer des pointeurs sur des membres protected ou private, c'est mal ?
    oui.
    car le principe de la POO, c'est l'encapsulation. en renvoyant un pointeur vers une donnée membre protégée ou privée, on viole ce principe.
    et si vraiment il est nécessaire de pouvoir accéder directement à une donnée membre, alors autant la mettre en public (et donc pas besoin de méthodes pour y accéder).

  9. #9
    Membre régulier Avatar de titoine1978
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Décembre 2005
    Messages : 132
    Points : 90
    Points
    90
    Par défaut
    Merci pour la précision. Je vais changer cette mauvaise habitude...

  10. #10
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut
    Citation Envoyé par LaseLiep
    J'te remercie, en effet ma fonction marche maintenant, mais je ne comprends po pourquoi.

    Je n'ai jamais vu de fonction qui renvoyer Type & fonction(). Cela signifie que si par exemple je veux que ma fonction retourne une adresse sur un int, je lui fait retourner juste son int, mais qu'ensuite dans le type de retour, je lui demande l'adresse de ce int? Et c'est en mettant int& que je peux avoir cela ???

    Et dans ce bout de code :
    Mon get() me renvoie déjà une adresse, donc pourquoi si j'ai l'adresse de mon x (appartenant à l'objet toto) je redemande encore une adresse ???


    Merci pour ton aide.
    type & toto = var; (référence sur une variable, alias)
    type * ptoto = &var; (pointeur)
    pas la même signification (voir FAQ : références)

  11. #11
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    J'te remercie bigboomshakala.
    J'avoue qu'après avoir fait du C, c'est vraiment pas facile de reconnaître une utilité à la référence. Quand faut-il l'utiliser, quand il ne faut po, quand utiliser les pointeurs ... C'est assez vague dans ma tête pour le moment

  12. #12
    Rédacteur
    Avatar de bigboomshakala
    Homme Profil pro
    Consultant Web .NET
    Inscrit en
    Avril 2004
    Messages
    2 077
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant Web .NET
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2004
    Messages : 2 077
    Points : 2 757
    Points
    2 757
    Par défaut


    en C on n'a pas le choix, il n'y a que les pointeurs.
    en C++, on privilégie généralement les références (pour faire simple, c'est un pointeur déguisé que l'utilisateur n'a pas a géré). c'est plus sûr, et l'écriture est plus naturel puisqu'on manipule la référence comme la variable elle-même (pas de -> ou d'*). c'est vrai qu'au départ c'est une notion qui peut-être difficile à intégrer.

    la référence est avantageuse aussi en cela qu'elle permet d'éviter la duplication d'objet. si on a besoin de passer en argument un objet à une fonction et qu'on sait qu'il ne sera pas modifié, on peut passer une référence constante, plutôt que de recopier l'objet
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void func (const type obj) // recopie
    {
       ... // obj pas modifié
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    // référence, pas de recopie de l'objet passé en argument
    void func (const type & obj) 
    {
       ... // obj pas modifié
    }


    note : désolé pour le "const type &"

  13. #13
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Juin 2005
    Messages
    114
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2005
    Messages : 114
    Points : 66
    Points
    66
    Par défaut
    Ok, faut que ça fasse son petit bonhomme de chemin dans ma tête, et que je pratique, ça viendra peut être plus facilement après (je l'espère tout du moins).

    J'te remercie pour le temps que tu as passé sur mon problème et pour tes explications.

  14. #14
    Membre éclairé Avatar de reggae
    Profil pro
    Inscrit en
    Août 2005
    Messages
    773
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Août 2005
    Messages : 773
    Points : 795
    Points
    795
    Par défaut
    Désolé pour le retard
    Si tu as un problème, consulte la FAQ:
    http://c.developpez.com/faq/cpp/?page=references
    voilavoila

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [débutant] Erreur de procédure "Subquery returned more than 1 value"
    Par jeanmarc1234 dans le forum Développement
    Réponses: 4
    Dernier message: 11/12/2008, 23h09
  2. Réponses: 12
    Dernier message: 26/08/2005, 10h02
  3. [Débutant]Erreur de compilation inconprehensible
    Par @r$£~%[ dans le forum C++
    Réponses: 15
    Dernier message: 14/08/2005, 20h04
  4. Réponses: 7
    Dernier message: 01/06/2005, 11h48
  5. [Débutant]Erreur compilation !
    Par gandalf_le_blanc dans le forum AWT/Swing
    Réponses: 23
    Dernier message: 30/08/2004, 14h23

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