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 :

fonctions amies (compilation)


Sujet :

C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Par d�faut fonctions amies (compilation)
    Bonjour � tous !

    Je d�sire cr�er une classe en red�finissant l'op�rateur d'addition. Je mets donc ceci dans le .h :
    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
     
    #include <list>
    #include <sstream>
     
    using namespace std;
     
     
    class BigInt  
    {
    public:
    	BigInt();
    	BigInt(const int& n);
    	virtual ~BigInt();
     
    	BigInt& operator =(const int& n);
    	bool operator >(const int& n);
    	bool operator >(const BigInt& bi);
     
    	friend BigInt operator+(const BigInt& a, const BigInt& b);
     
    private:
    	list<int> nombre;
    };
    et dans le .cpp :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    BigInt operator+(const BigInt& a, const BigInt& b) 
    {
    	BigInt res;
     
    	list<int>::const_reverse_iterator it1 = a.nombre.rbegin();
    	list<int>::const_reverse_iterator it2 = b.nombre.rbegin();
     
    	return res;
    }
    Lors de la compilation, j'ai l'erreur suivante :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    D:\mfc\fichusnombres\BigInt.cpp(74) : error C2248: 'nombre' : cannot access private member declared in class 'BigInt'
            D:\mfc\fichusnombres\BigInt.h(21) : see declaration of 'nombre'
    Pourtant la fonction est bien d�clar�e comme amie... que faire ?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    D�tails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par d�faut
    Salut,

    Est-ce que BigInt ne serait pas dans un namespace par hasard ?

    MAT.

  3. #3
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par d�faut
    Citation Envoy� par TheShade Voir le message
    Pourtant la fonction est bien d�clar�e comme amie... que faire ?
    En premier lieu, si tu as recours � friend dans un projet �l�mentaire, c'est probablement que tu t'es tromp� quelque part.

    Ensuite, si tu utilises l'op�rateur + avec deux arguments, c'est pour utiliser la fonction dans l'espace de nommage g�n�ral, donc il faudrait utiliser l'op�rateur de port�e :: pour sp�cifier cette fonction. Dans ton code, tu rends amie une des m�thodes de ta classe, ce qui ne sert � rien.

    Enfin, si tu veux faire X + Y entre deux BigInt, �tant donn� que X en est d�j� un, � + � est consid�r� comme une m�thode lui appartenant, et Y son unique argument. Moralit�, tu vires � friend �, tu vires � const Bigint & a �, tu fais l'addition entre l'instance de ton objet et � b �, et �a devrait fonctionner.

  4. #4
    Membre �clair� Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    D�tails du profil
    Informations personnelles :
    �ge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par d�faut
    Ton exemple devrait marcher. Quel compilateur utilises tu ?
    En premier lieu, si tu as recours � friend dans un projet �l�mentaire, c'est probablement que tu t'es tromp� quelque part.
    Parfois il est utile de faire une op�ration addition sym�trique, une fonction externe � la classe le permet et friend est souvent n�c�ssaire dans ce cas.
    D'ailleurs un des rare cas ou il est techniquement acceptable.

  5. #5
    Membre confirm� Avatar de zabibof
    Inscrit en
    F�vrier 2007
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2007
    Messages : 188
    Par d�faut
    Citation Envoy� par Obsidian Voir le message
    Dans ton code, tu rends amie une des m�thodes de ta classe
    Euh...

    Citation Envoy� par Obsidian
    Enfin, si tu veux faire X + Y entre deux BigInt, �tant donn� que X en est d�j� un, � + � est consid�r� comme une m�thode lui appartenant, et Y son unique argument.
    C'est moi qui ne comprend rien ou c'est toi qui dis n'importe quoi l�

    Citation Envoy� par TheShade
    Code C++ : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    BigInt operator+(const BigInt& a, const BigInt& b) 
    {
    	BigInt res;
     
    	list<int>::const_reverse_iterator it1 = a.nombre.rbegin();
    	list<int>::const_reverse_iterator it2 = b.nombre.rbegin();
     
    	return res;
    }
    Je ne sais pas o� tu veux en venir avec ce code (bon, peut-�tre que ce n'est pas le code complet)

    Sinon, normalement, si tu d�clares un op�rateur global ami d'une classe, elle devrait pouvoir acc�der � ses membres non-publiques, donc, c'est s�rement autre chose

  6. #6
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par d�faut
    Citation Envoy� par befalimpertinent Voir le message
    Parfois il est utile de faire une op�ration addition sym�trique, une fonction externe � la classe le permet et friend est souvent n�c�ssaire dans ce cas. D'ailleurs un des rare cas ou il est techniquement acceptable.
    Je suis d'accord, mais dans le cas pr�sent, il utilise � BigInt & � des deux c�t�s, alors pourquoi ?

  7. #7
    R�dacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par d�faut
    Bonjour,
    Avec VC++ Express et gcc (sous windows), chez moi, ton exemple compile parfaitement. La v�rit� est ailleurs.

  8. #8
    Mod�rateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 49
    Localisation : France, Essonne (�le de France)

    Informations professionnelles :
    Activit� : Chercheur d'emploi
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par d�faut
    Citation Envoy� par zabibof Voir le message
    Euh...
    C'est moi qui ne comprend rien ou c'est toi qui dis n'importe quoi l�
    Erreur de ma part, effectivement. J'avais un peu trop l'habitude d'utiliser l'op�rateur de port�e pour atteindre d'autres m�thodes. � ma d�charge, j'ai post� tard et je n'utilise friend que tr�s rarement.

    Par contre, reconnais qu'utiliser l'op�rateur global pour additionner deux membres d'une m�me classe n'a aucun int�r�t dans le cas pr�sent. Tu n'es pas d'accord ?

  9. #9
    screetch
    Invit�(e)
    Par d�faut
    peut etre en la declarant avant, pour etre sur que les namespace, etc... convergent

    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
     
    BigInt operator+(const BigInt& a, const BigInt& b);
     
    class BigInt  
    {
    public:
    	BigInt();
    	BigInt(const int& n);
    	virtual ~BigInt();
     
    	BigInt& operator =(const int& n);
    	bool operator >(const int& n);
    	bool operator >(const BigInt& bi);
     
    	friend BigInt operator+(const BigInt& a, const BigInt& b);
     
    private:
    	list<int> nombre;
    };

  10. #10
    Membre confirm� Avatar de zabibof
    Inscrit en
    F�vrier 2007
    Messages
    188
    D�tails du profil
    Informations forums :
    Inscription : F�vrier 2007
    Messages : 188
    Par d�faut
    Citation Envoy� par Obsidian Voir le message
    Par contre, reconnais qu'utiliser l'op�rateur global pour additionner deux membres d'une m�me classe n'a aucun int�r�t dans le cas pr�sent. Tu n'es pas d'accord ?
    Ben non , si c'�tait l'op�rateur +=, je serais d'accord. Moi, je surcharge toujours l'op�rateur + en global mais bon, � chacun ses m�thodes

  11. #11
    Membre Expert
    Homme Profil pro
    edi
    Inscrit en
    Juin 2007
    Messages
    941
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activit� : edi

    Informations forums :
    Inscription : Juin 2007
    Messages : 941
    Par d�faut
    Citation Envoy� par Obsidian Voir le message
    En premier lieu, si tu as recours � friend dans un projet �l�mentaire, c'est probablement que tu t'es tromp� quelque part.
    Je ne vois pas exactement en quoi ; �a me para�t ici tout � fait coh�rent avec ce qu'il d�veloppe. L'autre solution serait d'avoir un accesseur � la liste, mais ici je ne crois pas que se serait pertinent.

    Citation Envoy� par Obsidian Voir le message
    Ensuite, si tu utilises l'op�rateur + avec deux arguments, c'est pour utiliser la fonction dans l'espace de nommage g�n�ral, donc il faudrait utiliser l'op�rateur de port�e :: pour sp�cifier cette fonction.
    Pourquoi aurait-on besoin de '::' ?

    Citation Envoy� par Obsidian Voir le message
    Dans ton code, tu rends amie une des m�thodes de ta classe, ce qui ne sert � rien.
    Laquelle ? La seule fonction amie ici est �galement la seule fonction qui ne soit pas une m�thode de classe, justement.

    Citation Envoy� par Obsidian Voir le message
    Enfin, si tu veux faire X + Y entre deux BigInt, �tant donn� que X en est d�j� un, � + � est consid�r� comme une m�thode lui appartenant, et Y son unique argument. Moralit�, tu vires � friend �, tu vires � const Bigint & a �, tu fais l'addition entre l'instance de ton objet et � b �, et �a devrait fonctionner.
    C'est vrai que �a pourrait marcher, mais normalement, on ne fait pas comme �a, pour des questions d'arit�, de sym�trie ; il y a m�me, me semble-t-il, tout un paragraphe de la Faq qui y est consacr�.

    Concr�tement, c'est la diff�rence entre 'a+=b, et 'c = a + b'. Dans le premier cas, '+=' peut s'utiliser seul, et a un sens, l'objet 'a' est central dans cette op�ration. Mais '+' n'a aucun sens seul : on ne fait pas 'a + b', mais 'c = a + b', l'op�rateur doit �tre combin� � autre chose ; de plus, on peut voir que 'a' n'est pas central au traitement, on prend des objets, qui ont la m�me importance, afin d'en cr�er un 3�me. D'ailleurs, '+=' renvoie l'objet sur lequel a �t� effectu�e l'op�ration, alors que '+' renvoie un objet nouveau.

    De plus, '+' est d�finit ici pour des BigInt, mais il pourrait combiner un BigInt et un int. Or, avec '+', tu peux faire 'a + b', mais aussi 'b + a'. Si tu d�finit 'operator+' en m�thode de classe, 'BigInt + int' est correct, mais 'int + BigInt' ne l'est pas, ce qui est oppos� au sens intuitif de cet op�rateur. D'ailleurs, il faudrait d�finir les deux fonctions :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    BigInt operator+(const BigInt& b, int i);
    BigInt operator+(int i, const BigInt& b);
    Par contre, selon ce principe, les op�rateurs de comparaison (bool operator <) devraient aussi �tre des fonctions ext�rieures, et non des m�thodes de classe.

    Il y a 2 choses sinon qui me pr�occupent :

    Est-ce-que l'on doit pouvoir h�riter de ta classe ? Je n'en ai pas l'impression, et dans ce cas tu devrais pas mettre le destructeur en virtual.

    Ceci veut dire que tu as fait 'using namespace std;' dans le .h de ta classe, et c'est quelque chose � �viter.

    A part �a, je ne comprends pas que �a ne compile pas. Ton code m'a l'air correct, et sur ma machine �a compile sans probl�me, � mon avis �a doit venir d'autre part .

Discussions similaires

  1. [SQL2005][TSQL] Probl�me de curseur / Fonction ne "compile" pas
    Par Ivenoproblemwiththat dans le forum MS SQL Server
    R�ponses: 3
    Dernier message: 01/06/2007, 21h55
  2. Fonction ami + template
    Par zenux dans le forum Langage
    R�ponses: 8
    Dernier message: 08/12/2006, 15h59
  3. fonctions amies
    Par Vips dans le forum C++
    R�ponses: 10
    Dernier message: 24/03/2006, 04h41
  4. fonctions amies
    Par hamma2 dans le forum C++
    R�ponses: 4
    Dernier message: 10/12/2005, 20h19
  5. [C++] Fonction amie vituelle dans une classe ?
    Par Bob.Killer dans le forum C++
    R�ponses: 11
    Dernier message: 04/12/2005, 13h42

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