Comment les fonction Standards C++ comme (cout<<, cin>>,...) accédent aux attributs private d'une classe utilisateurs ??
Comment les fonction Standards C++ comme (cout<<, cin>>,...) accédent aux attributs private d'une classe utilisateurs ??
cout n'accède à rien du tout. Depuis une portée donnée, on va lui injecter une variable. Si la variable est visible depuis la portée donnée, ben ça passe. Exactement comme avec n'importe quelle autre fonction.
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
Salut,
cin et cout ne sont, en fait "que" des "gestionnaires de flux"...
C'est à dire que cin va "se contenter" de capturer des informations dans le flux d'entrée standard (typiquement, mais pas obligatoirement, ce qui est envoyé par le clavier) et d'"injecter" ces informations où on le lui demande, et cout va "se contenter" de prendre les informations qu'on lui donne et de les injecter dans le flux de sortie standard (typiquement, mais pas obligatoirement l'écran)
Ces "gestionnaires de flux" utilisent des "opérateurs de flux" (les fameux << et >>, selon que ce soit pour cout ou pour cin) pour travailler...
Les opérateur de flux sont dés le départ prévus pour fonctionner avec les types de base (char, int, long, double) et avec certains type de la bibliotheque standard (les string, par exemple).
N'oublie pas qu'un opérateur, ce n'est, en définitive, qu'une fonction un peu spéciale, que tu peux décider de surcharger à ta guise... << et >> ne font pas exception.
Alors, si tu as une classe du genre de
Dans se cas de figure, le compilateur refusera un code du genre de
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 class A { public: // ce qui va bien en public protected: //ce qui va bien en protected private: int num; std::string chaine; };
en t'indiquant que num et chaine sont "private in this context" (inaccessibles car privés dans le contexte dans lequel tu essaye de les utiliser)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 A obja; //gestion de obja std::cout<<obja.num<<" "<<obja.chaine<<std::endl;
Par contre, tu pourrais tres bien décider de créer une fonction membre du genre de (en la déclarant public, cela va de soi)
Comme la fonction membre d'une classe peut accéder à sa guise aux membre de la classe à laquelle elle appartient, c'est on ne peut plus valide
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void A::Print() { std::cout<<num<<" "<<chaine<<std::endl; }
Tu l'appelleras sous la forme de
Si tu veux intégrer l'affichage dans un affichage plus "conséquent", il risque d'être lourd de devoir écrire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 A obja; //gestion de obja ... obja.print();//appel de la fonction membre Print()
Mais, comme les opérateurs peuvent etre surchargés, tu peux tout aussi bien décider de surcharger l'opérateur << de manière publique pour ta classe A, ce qui donne:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::cout<<"voici les informations de obja"<<std::endl; obja.Print(); std::cout<<"Merci et au revoir"<<std::endl;
Du fait que l'opérateur << est surchargé pour la classe A, il devient fonction membre de la classe A, avec tout ce que cela implique au niveau des autorisations par rapport aux membres de A...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 std::ostream& A::operator<<(std::ostream& oss) { // on est bien dans une fonction membre de A oss<<num<<" "<<chaine; return oss; }
Ce qui te permettra alors d'écrire tout simplement
Et, comme l'operateur << est public dans A, le compilateur ne verra aucune objection à l'utiliser
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 std::cout<<"voici les informations de oja"<<std::endl <<obja<<std::endl <<"merci et au revoir"<<std::endl;![]()
A méditer: La solution la plus simple est toujours la moins compliquée
Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
Compiler Gcc sous windows avec MinGW
Coder efficacement en C++ : dans les bacs le 17 février 2014
mon tout nouveau blog
ça c'est de la réponse ! merci bien en tout cas pour ce rappel !
Partager