Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4105 connectés 

 


Dernière réponse
Sujet : [C++] friend ca veut dire ami en anglais non ?
janoscoder ça craint, c'est pas pratique, mais c'est cohérent car le truc friend peut exister disons dans deux classes
genre
 
 
class A
{
 friend int func(Aà dat);
 int gettype(){return 0;}
};
 
class B: public A
{
 friend int func(A & dat)
 int getttype(){return 1;}
};
 
class C: public A
{
 friend int func(A & dat);
 int gettype(){return 2;}
};
 
voif func(A& dat)
{
 switch(datgettype())
 ...
 traitement en fc du type
}
 
l'exemple est bidon, mais on voit le prob.
Soit on accepte que la ligne
friend void func()...
soit une déclaration de fonction
et dans ce cas y'a trois déclarations (identiques, soit),
soit on ne considère pas que c'est une déclaration (cf bjarne), et donc la fonction n'est pas déclarée.
donc la ligne avec friend devrait renvoyer l'erreur: connait pas cette fonction moi. (ms a le bon goût de ne pas renvoyer l'erreur et de se plaindre plus tard)
 
Un déclaration antérieure est donc nécessaire.
 
gcc, lui, accepte bien des friends, mais ne les considère pas comme déclaration. Si la fonction n'est pas connue, il ne se plaint pas (c'est l'ennui de cette façon de voir les choses).
Donc quand la fonction est définie plus tard, il regarde si son prototype appartient à la liste des amis de la classe et se comporte en conséquence.
 
Pour une fois que ms sacrifie l'idéalisme au pragmatisme...
 
A+
 
j'avoue, ce bug m'a bien fait chier des bulles en janvier.

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
janoscoder ça craint, c'est pas pratique, mais c'est cohérent car le truc friend peut exister disons dans deux classes
genre
 
 
class A
{
 friend int func(Aà dat);
 int gettype(){return 0;}
};
 
class B: public A
{
 friend int func(A & dat)
 int getttype(){return 1;}
};
 
class C: public A
{
 friend int func(A & dat);
 int gettype(){return 2;}
};
 
voif func(A& dat)
{
 switch(datgettype())
 ...
 traitement en fc du type
}
 
l'exemple est bidon, mais on voit le prob.
Soit on accepte que la ligne
friend void func()...
soit une déclaration de fonction
et dans ce cas y'a trois déclarations (identiques, soit),
soit on ne considère pas que c'est une déclaration (cf bjarne), et donc la fonction n'est pas déclarée.
donc la ligne avec friend devrait renvoyer l'erreur: connait pas cette fonction moi. (ms a le bon goût de ne pas renvoyer l'erreur et de se plaindre plus tard)
 
Un déclaration antérieure est donc nécessaire.
 
gcc, lui, accepte bien des friends, mais ne les considère pas comme déclaration. Si la fonction n'est pas connue, il ne se plaint pas (c'est l'ennui de cette façon de voir les choses).
Donc quand la fonction est définie plus tard, il regarde si son prototype appartient à la liste des amis de la classe et se comporte en conséquence.
 
Pour une fois que ms sacrifie l'idéalisme au pragmatisme...
 
A+
 
j'avoue, ce bug m'a bien fait chier des bulles en janvier.
tgrx ah oui mais ca craint :
 
alors il faudrait faire :
 

Code :
  1. class A;
  2. ostream& operator << (ostream& o, const A& a);
  3. class A
  4. {
  5. public:
  6.   friend ostream& operator << (ostream& o, const A& a);
  7. };


 
Je n'aurai qu'une chose a dire : merci Microsoft... :sarcastic:

 

[edit]--Message édité par tgrx--[/edit]

janoscoder janoscoder is a lifesaver!
fait un ctrl-c ctrl-v des prototypes des deux fonction pour les mettre avant la définition de la classe.
msvc (et c'est la norme, je pense) ne veut accepter de déclaration friend que de trucs dont on a déjà déclaré l'existance.
 
 
dont
fonc
class truc
{
 
friend fonc
};
 
fonc
{
 
}
minusplus :lol:
BENB Reponse idiote ? tu as essaye sans les espaces entre Xstream et &
et entre operator et << ou >>?
 
je sais c'est idiot, mais bon...
minusplus et ben VC++ c'est caca !
tgrx gcc compile aussi mon programme, c'est Visual qui veut pas.
Et puis regarde mon post, j'ai fait un copier coller de mon source... et ca passe pas... :sarcastic:
minusplus gcc compile ça :
 
#include <iostream>
 
class truc{
  private:
    int machin;
  public:
    truc() : machin(0){};
  friend ostream& operator<<(ostream& os, truc& t);
     
};
 
ostream& operator<<(ostream& ost, truc& t){  
  int bidule;
  bidule  = t.machin;
  ost << bidule << endl;
}
 
int main(){};
 
 
 
 
t'es sur que t'as pas oublié un & ou une connerie comme ça qqpart passke si c'est le cas, le compilo ne reconnait pas l'opérateur comme friend et t'envoie bouler. (c'est ce qui m'est arrivé ! :D )
tgrx J'ai essaye private, protected, public, rien a faire, visual s'en fout royalement...
BENB

tgrx a écrit a écrit :

BENB > le probleme c'est que visual accepte tres bien les operateurs << et >> pour des membres publics, mais pas pour des membres prives...
 
Faut-il que je declare les operateurs en private ?? Je vais essayer.




 
Oui, mais pour les publics ces methodes n'ont pas besoin d'etre friend...
la position de la declaration friend n'a aucune importance d'apres le Stroustrup, maintenant, en visual peut-etre...
mais je ne vois pas l'interet d'un friends pour ne voir que les publics ?
As-tu essaye de les mettre protected ?

tgrx ben non ca change rien :eek:
 
Les visualiens, vous avez deja du etre confrontes a ce genre de probleme...
tgrx BENB > le probleme c'est que visual accepte tres bien les operateurs << et >> pour des membres publics, mais pas pour des membres prives...
 
Faut-il que je declare les operateurs en private ?? Je vais essayer.
BENB Je ne vois pas !
 
regarde avant les declarations de prototypes de ces fontions s'il ne manque rien comme une parenthese/accolade non fermee...
tgrx voici un extrait de classe toute bete :  
 

Code :
  1. class Cell
  2. {
  3.   ...
  4. public:
  5.   friend ifstream & operator >> (ifstream& in, Cell& c);
  6.   friend ofstream & operator << (ofstream& in, const Cell& c);
  7. };


 
... plus loin dans mon cpp j'ai ca :
 

Code :
  1. ifstream& operator >> (ifstream& in, Cell& c)
  2. {
  3.   ...
  4. }
  5. ofstream& operator << (ofstream& out, const Cell& c)
  6. {
  7.   ...
  8. }


 
 
et a la compilation j'ai ca : :sarcastic:
 

Code :
  1. D:\Microsoft Visual Studio\MyProjects\TECC\Source\streams.cpp(233) : error C2248: 'imax' : cannot access private member declared in class 'Cell'


 
 
C'est quoi le bleme ? A noter que ca me le fait avec Visual C++, mais pas avec g++... Je vais quand meme pas tout declarer en public pour lui faire plaisir :sweat:

 

[edit]--Message édité par tgrx--[/edit]


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)