OVH Cloud OVH Cloud

"friend" pas amicaux !

4 réponses
Avatar
Jean-Noël Mégoz
Salut !

je vous livre un extrait d'un programme que j'ai tapé texto à partir d'un
cours :
-- dans le
.h ------------------------------------------------------------------
class Money
{
friend ostream& operator<<(ostream& out, const Money& M);
public:
int Pounds, Pence;
}
-- dans le
.cpp ---------------------------------------------------------------
ostream& operator<<(ostream& out, const Money& M)
{
out<<'£'<<M.Pounds<<'.'<<setw(2)<<setfill('0')<<M.Pence;
return out;
}
----------------------------------------------------------------------------
---
Mon soucis est que lorsque je demande à Visual C++ de me compiler ça, il
m'envoie 2 erreurs
sur la redéfinition de << :
error C2248: 'Pounds' : cannot access private member declared in class
'Money'
error C2248: 'Pence' : cannot access private member declared in class
'Money'

Mise à part la position du protoype de operator<< (dans la section "public"
et non avant), l'exemple donné dans l'aide en ligne de Visual C++ est
strictement équivalent, et ne compile pas plus ! Elle dit pourtant bien que
"The friend keyword allows a function or class to gain access to the private
and protected members of a class.".

Je me demande donc ce qui peut empêcher ces 2 exemples de fonctionner. Une
idée ?

J.No.

4 réponses

Avatar
Alexandre
"Jean-Noël Mégoz" a écrit dans le message de
news:4093c87b$0$8642$
Salut !


bonjour,



je vous livre un extrait d'un programme que j'ai tapé texto à partir d'un
cours :
-- dans le
.h ------------------------------------------------------------------
class Money
{
friend ostream& operator<<(ostream& out, const Money& M);
public:
int Pounds, Pence;
}


erreur de frappe ? Il manque un ; après le }
de plus, tout étant public dans cette classe, il est inutile de définir
l'opérateur en ami...
j'aurais de plus mis des std::ostream à la place des ostream....

-- dans le
.cpp ---------------------------------------------------------------
ostream& operator<<(ostream& out, const Money& M)
{
out<<'£'<<M.Pounds<<'.'<<setw(2)<<setfill('0')<<M.Pence;
return out;
}
--------------------------------------------------------------------------
--



---
Mon soucis est que lorsque je demande à Visual C++ de me compiler ça, il
m'envoie 2 erreurs
sur la redéfinition de << :
error C2248: 'Pounds' : cannot access private member declared in class
'Money'
error C2248: 'Pence' : cannot access private member declared in class
'Money'


étrange, puisqu'il n'y a pas de membre privé dans ta classe .


Mise à part la position du protoype de operator<< (dans la section
"public"

et non avant), l'exemple donné dans l'aide en ligne de Visual C++ est
strictement équivalent, et ne compile pas plus ! Elle dit pourtant bien
que

"The friend keyword allows a function or class to gain access to the
private

and protected members of a class.".

Je me demande donc ce qui peut empêcher ces 2 exemples de fonctionner. Une
idée ?

J.No.




Avatar
Jean-Noël Mégoz
"Alexandre" a écrit dans le message de
news:4093e72e$0$20745$

class Money
{
friend ostream& operator<<(ostream& out, const Money& M);
public:
int Pounds, Pence;
}


erreur de frappe ? Il manque un ; après le }


Erreur, oui, mais de copier/coller : le ";" est bien présent dans mon
code...


Avatar
Jean-Noël Mégoz
"Alexandre" a écrit dans le message de
news:4093e72e$0$20745$

class Money
{
friend ostream& operator<<(ostream& out, const Money& M);
public:
int Pounds, Pence;
}


erreur de frappe ? Il manque un ; après le }
de plus, tout étant public dans cette classe, il est inutile de définir
l'opérateur en ami...
j'aurais de plus mis des std::ostream à la place des ostream....


pour les "std::" manquants, c'est normal car il est précisé "using namespace
std;" au début du fichier.


Avatar
drkm
"Jean-Noël Mégoz" writes:

Salut !

je vous livre un extrait d'un programme que j'ai tapé texto à partir
d'un cours :


[...]

Ce qui est étrange, c'est que les champs de ta classe sont
publiques. Une erreur de recopiage, j'imagine ? Inclus-tu l'entête
définissant ta classe dans le fichier implémentant l'opérateur de
sortie ? Et que ce passe-t-il si tu déclare l'opérateur avant la
classe, dans l'entête ? Comme ceci :

std::ostream & operator<<( std::ostream & out , MaClasse & obj ) ;

class MaClasse
{
friend std::ostream & operator<<(
std::ostream & out ,
MaClasse & obj
) ;
private:
int myField ;
} ;

--drkm