{"id":85,"date":"2008-08-12T21:07:06","date_gmt":"2008-08-12T19:07:06","guid":{"rendered":"http:\/\/linux.leunen.com\/?p=85"},"modified":"2008-08-12T21:07:06","modified_gmt":"2008-08-12T19:07:06","slug":"c-classes-et-fonctions-amies","status":"publish","type":"post","link":"https:\/\/www.leunen.com\/linux\/2008\/08\/c-classes-et-fonctions-amies\/","title":{"rendered":"C++ &#8211; Classes et fonctions amies"},"content":{"rendered":"<p>On utilise la notion d&rsquo;ami lorsque l&rsquo;on a deux classes dont l&rsquo;une doit avoir acc\u00e8s aux donn\u00e9es membres priv\u00e9es de l&rsquo;autre.<br \/>\nCette fa\u00e7on de faire permet de limiter \u00e0 une seule classe l&rsquo;acc\u00e8s \u00e0 des donn\u00e9es priv\u00e9es et de ne pas devoir rendre celles-ci publiques ce qui les rendrait disponibles pour tout objet ou classe.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">class<\/span> A\r\n{\r\n  <span class=\"reservedname\">public<\/span>:\r\n    <span class=\"reservedname\">void<\/span> f();\r\n};\r\n\r\n<span class=\"reservedname\">class<\/span> B\r\n{\r\n  <span class=\"reservedname\">private<\/span>:\r\n    <span class=\"reservedname\">friend<\/span> <span class=\"reservedname\">class<\/span> A;\r\n    <span class=\"reservedname\">int<\/span> g(){<span class=\"reservedname\">return<\/span> x;}\r\n    <span class=\"reservedname\">int<\/span> x;\r\n};\r\n<\/pre>\n<p>Il est important de remarquer que c&rsquo;est la classe qui veut partager ses donn\u00e9es priv\u00e9es avec une autre qui donne l&rsquo;acc\u00e8s \u00e0 celles-ci en sp\u00e9cifiant que l&rsquo;autre classe est une amie.<br \/>\nCela se fait avec le mot-cl\u00e9 <em>friend<\/em> suivi de la classe qui re\u00e7oit l&rsquo;acc\u00e8s aux donn\u00e9es priv\u00e9es.<br \/>\nLes bonnes pratiques de la programmation veulent que m\u00eame si dans ce cas-ci, A a acc\u00e8s \u00e0 <em>x<\/em> dans B, A n&rsquo;y fasse appel que via une fonction priv\u00e9e <em>g()<\/em>, qui sert d&rsquo;interface, et non directement. Rien ne l&#8217;emp\u00eache n\u00e9anmoins si ce n&rsquo;est le code de bonne pratique.<\/p>\n<p>En r\u00e9alit\u00e9, cette notion de classe amie est une g\u00e9n\u00e9ralisation des fonctions amies. On peut tr\u00e8s bien avoir une fonction membre d&rsquo;une classe ou une fonction globale \u00e0 laquelle une classe accorderait l&rsquo;acc\u00e8s \u00e0 ses donn\u00e9es priv\u00e9es. Le principe est le m\u00eame que pour une classe.<\/p>\n<pre class=\"codesource\">\r\n<span class=\"reservedname\">class<\/span> A\r\n{\r\n  <span class=\"reservedname\">public<\/span>:\r\n    <span class=\"reservedname\">int<\/span> f();\r\n\r\n<span class=\"reservedname\">class<\/span> B\r\n{\r\n  <span class=\"reservedname\">private<\/span>:\r\n    <span class=\"reservedname\">friend<\/span> <span class=\"reservedname\">int<\/span> global_func();\r\n    <span class=\"reservedname\">friend<\/span> <span class=\"reservedname\">void<\/span> A::f();\r\n    <span class=\"reservedname\">int<\/span> x;\r\n};\r\n\r\n<span class=\"reservedname\">int<\/span> A::f()\r\n{\r\n  B b;\r\n  <span class=\"reservedname\">return<\/span> b.x;\r\n}\r\n\r\n<span class=\"reservedname\">int<\/span> global_func()\r\n{\r\n  B b;\r\n  <span class=\"reservedname\">return<\/span> b.x;\r\n}\r\n<\/pre>\n<p>Notez \u00e9galement que les d\u00e9clarations d&rsquo;amis peuvent \u00eatre faites tant dans la partie priv\u00e9e que publique de la classe. Il n&rsquo;y a aucune diff\u00e9rence entre les deux.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>On utilise la notion d&rsquo;ami lorsque l&rsquo;on a deux classes dont l&rsquo;une doit avoir acc\u00e8s aux donn\u00e9es membres priv\u00e9es de l&rsquo;autre. Cette fa\u00e7on de faire permet de limiter \u00e0 une seule classe l&rsquo;acc\u00e8s \u00e0 des donn\u00e9es priv\u00e9es et de ne pas devoir rendre celles-ci publiques ce qui les rendrait disponibles pour tout objet ou classe. [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[4],"tags":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/85"}],"collection":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/comments?post=85"}],"version-history":[{"count":0,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/posts\/85\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/media?parent=85"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/categories?post=85"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.leunen.com\/linux\/wp-json\/wp\/v2\/tags?post=85"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}