[C++] friend ca veut dire ami en anglais non ?

friend ca veut dire ami en anglais non ? [C++] - Programmation

Marsh Posté le 15-06-2001 à 16:32:24    

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]

Reply

Marsh Posté le 15-06-2001 à 16:32:24   

Reply

Marsh Posté le 15-06-2001 à 16:40:23    

Je ne vois pas !
 
regarde avant les declarations de prototypes de ces fontions s'il ne manque rien comme une parenthese/accolade non fermee...

Reply

Marsh Posté le 15-06-2001 à 16:42:39    

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.

Reply

Marsh Posté le 15-06-2001 à 16:44:26    

ben non ca change rien :eek:
 
Les visualiens, vous avez deja du etre confrontes a ce genre de probleme...

Reply

Marsh Posté le 15-06-2001 à 16:45:48    

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 ?

Reply

Marsh Posté le 15-06-2001 à 16:48:30    

J'ai essaye private, protected, public, rien a faire, visual s'en fout royalement...

Reply

Marsh Posté le 15-06-2001 à 17:05:20    

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 )

Reply

Marsh Posté le 15-06-2001 à 17:09:26    

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:

Reply

Marsh Posté le 15-06-2001 à 17:13:23    

et ben VC++ c'est caca !

Reply

Marsh Posté le 15-06-2001 à 17:16:58    

Reponse idiote ? tu as essaye sans les espaces entre Xstream et &
et entre operator et << ou >>?
 
je sais c'est idiot, mais bon...

Reply

Marsh Posté le 15-06-2001 à 17:16:58   

Reply

Marsh Posté le 15-06-2001 à 17:19:17    

:lol:

Reply

Marsh Posté le 15-06-2001 à 17:19:53    

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
{
 
}

Reply

Marsh Posté le 15-06-2001 à 17:33:37    

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]

Reply

Marsh Posté le 15-06-2001 à 18:00:45    

ç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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed