friend ca veut dire ami en anglais non ? [C++] - Programmation
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...
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.
Marsh Posté le 15-06-2001 à 16:44:26
ben non ca change rien
Les visualiens, vous avez deja du etre confrontes a ce genre de probleme...
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 ?
Marsh Posté le 15-06-2001 à 16:48:30
J'ai essaye private, protected, public, rien a faire, visual s'en fout royalement...
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é ! )
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...
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...
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
{
}
Marsh Posté le 15-06-2001 à 17:33:37
ah oui mais ca craint :
alors il faudrait faire :
Code :
|
Je n'aurai qu'une chose a dire : merci Microsoft...
[edit]--Message édité par tgrx--[/edit]
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.
Marsh Posté le 15-06-2001 à 16:32:24
voici un extrait de classe toute bete :
... plus loin dans mon cpp j'ai ca :
et a la compilation j'ai ca :
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
[edit]--Message édité par tgrx--[/edit]