<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog de David Côme &#187; C++</title>
	<atom:link href="https://blog.developpez.com/davidbrcz/pcategory/c/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/davidbrcz</link>
	<description></description>
	<lastBuildDate>Sat, 11 Apr 2009 10:58:56 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>Comment éviter que les énumérations polluent ?</title>
		<link>https://blog.developpez.com/davidbrcz/p6157/c/title_101</link>
		<comments>https://blog.developpez.com/davidbrcz/p6157/c/title_101#comments</comments>
		<pubDate>Sun, 03 Aug 2008 21:20:34 +0000</pubDate>
		<dc:creator><![CDATA[davidbrcz]]></dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Les énumérations peuvent être source de problèmes de pollution de portée, comment les résoudres ? Un rappel sur les énumérations Les énumérations sont un outil très puissant puisqu&#8217;elle permettent de définir des types n&#8217;acceptant que certaines valeurs bien précises. Exemple enum Carte {Pique,Coeur,Carreau, Trefle}; va définir un type Carte ne pouvant prendre que les valeurs Pique,Coeur,Carreau ou encore Trefle. Il est aussi possible de définir une énumération anonyme. Dans ce cas, les valeurs dans l&#8217;énumération [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Les énumérations peuvent être source de problèmes de pollution de portée, comment les résoudres ?<br />
<span id="more-1"></span><br />
<strong>Un rappel sur les énumérations</strong><br />
Les énumérations sont un outil très puissant puisqu&rsquo;elle permettent de définir des types n&rsquo;acceptant que certaines valeurs bien précises. </p>
<p>Exemple</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">enum Carte {Pique,Coeur,Carreau, Trefle};</div></div>
<p>va définir un type Carte ne pouvant prendre que les valeurs Pique,Coeur,Carreau ou encore Trefle.</p>
<p>Il est aussi possible de définir une énumération anonyme. Dans ce cas, les valeurs dans l&rsquo;énumération sont tout simplement des constantes.<br />
Exemple:<br />
<code class="codecolorer text default"><span class="text">enum {alpha,beta,release};</span></code> va définir 3 constantes : alpha, beta et release.</p>
<p>Mais dans tous les cas, les valeurs définies seront dans le namespace global. Autrement dit,si on souhaite avoir une constante de même nom dans deux énumérations différentes, ce n&rsquo;est pas possible.</p>
<p>Exemple:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">enum Fruit {Pomme, Orange}; <br />
enum Couleur {Couleur, Orange}; //ne compilera pas, Orange est deja  defini.</div></div>
<p>Ce n&rsquo;est pas très pratique, avouons le. Comment peut-on remédier à cela ?</p>
<p><strong>Limiter la portée des énumérations globales</strong><br />
Comme nous l&rsquo;avons vu, une énumération définie le namespace globale va le polluer entiérement. Ce que propose le C++ pour éviter les conflits de nom est de pouvoir créer son propre namespace. le namespace (ou est espace de nom en français), est un mécanisme permettant de regrouper dans une même portée un ensemble de classes, fonctions ou encore d&rsquo;objets ayant des relations en communs. Le namespace le plus connu est std: il représente le namespace de la bibliothèque standard.</p>
<p>Donc pour résoudre notre problème de conflit de nom, il suffit de définir notre énumération dans un namespace personnel. On appel souvent ce namespace de la même façon que l&rsquo;énumération de façon à pouvoir écrire des choses comme:</p>
<p><code class="codecolorer text default"><span class="text">Carte::Type c= Carte::Pique;</span></code><br />
avec la définition de l&rsquo;énumération sous la forme:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">namespace Carte <br />
{ <br />
&nbsp; enum Type {Pique,Trefle,Coeur,Carreau}; <br />
}</div></div>
<p><strong>Limiter la portée des énumérations locales à une classe</strong><br />
Cette solution est adaptée aux énumérations globales, mais que se passe t&rsquo;il pour les énumérations locales à une classe ?</p>
<p>En effet, en C++ on peut définir une énumération dans une classe.<br />
Exemple:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">//classe represantant un fruit avec un colorant alimentaire <br />
class FruitColore <br />
{ <br />
&nbsp; enum Fruit {Pomme, Orange}; <br />
&nbsp; enum Couleur {Vert,Orange}; <br />
};</div></div>
<p>Mais cette classe ne compilera pas, à cause de la redéfinition d&rsquo;orange. et on ne peut pas passer par un namespace, puisque un namespace dans une classe n&rsquo;aurait pas beaucoup de sens.</p>
<p>La solution est de passer par les structures. En definissant l&rsquo;énumération dans une structure, on limite sa portée à la dite structure.</p>
<p>Exemple:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class FruitColore <br />
{ <br />
&nbsp; &nbsp; struct Fruit {enum &nbsp;{Pomme, Orange};}; <br />
&nbsp; &nbsp; struct Couleur {enum {Vert,Orange};}; <br />
};</div></div>
<p>Pour créer des types et non juste définir des constantes, il suffit de rajouter un nom à l&rsquo;énumération.<br />
Exemple:</p>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">class FruitColore <br />
{ <br />
&nbsp; &nbsp; struct Fruit {enum type {Pomme, Orange};}; <br />
&nbsp; &nbsp; struct Couleur {enum type {Vert,Orange};}; <br />
}; <br />
void foo(FruitColore::Fruit::type t) <br />
{ <br />
&nbsp; &nbsp; std::cout&lt;&lt;&quot;t= &quot;&lt;&lt;t&lt;&lt;std::endl; <br />
}</div></div>
<p><strong>Conclusion</strong><br />
L&rsquo;utilisation des namespace et de structure pour limiter la portée des énumérations est quelque chose de bien pratique sur plusieurs points, mais amené à disparaitre à cause des <em>class enum</em> de C++0x, qui feront ce que nous avons fait (et même plus) de façon bien plus rapide.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sortie de Ultimate C++ 2008.1</title>
		<link>https://blog.developpez.com/davidbrcz/p6168/c/sortie_de_ultimate_c_2008_1</link>
		<comments>https://blog.developpez.com/davidbrcz/p6168/c/sortie_de_ultimate_c_2008_1#comments</comments>
		<pubDate>Thu, 07 Aug 2008 08:43:35 +0000</pubDate>
		<dc:creator><![CDATA[davidbrcz]]></dc:creator>
				<category><![CDATA[C++]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Aujourd&#8217;hui, un petit billet pour présenter Ultimate C++, qui vient de sortir sa nouvelle version. Ultimate C++ est un RAD comprenant en autre un IDE, une bibliothèque touche à tout (GUI, SQl,&#8230;), un designer; le tout étant disponible sur de multiples plateformes sous une licence libre (BSD). L&#8217;IDE se veut polyvalent et puissant en intégrant un système d&#8217;aide pour la bibliothèque, des technologies pour accélérer la recompilation d&#8217;un projet, en étant capable de travailler avec [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Aujourd&rsquo;hui, un petit billet pour présenter Ultimate C++, qui vient de sortir sa nouvelle version.<br />
<span id="more-2"></span></p>
<p>Ultimate C++ est un RAD comprenant en autre un IDE, une bibliothèque touche à tout (GUI, SQl,&#8230;), un designer; le tout étant disponible sur de multiples plateformes sous une licence libre (BSD). L&rsquo;IDE se veut polyvalent et puissant en intégrant un système d&rsquo;aide pour la bibliothèque, des technologies pour accélérer la recompilation d&rsquo;un projet, en étant capable de travailler avec les principaux compilateurs du marché (g++, visual,&#8230;)</p>
<p>Liste d&rsquo;un partie des nouveautés:<br />
L&rsquo;annonce de la release sur Usenet avance 200 nouveautés dont:</p>
<ul>
<li> Une nouvelle implémenation beaucoup plus performante des String/WString </li>
<li> Présence d&rsquo;un nouvel allocateur de tas de haute-performance (presque) sans lock </li>
<li> Un support amélioré du multi-thread </li>
<li> une classe CoWork pour aider à paralléliser le code. </li>
<li> Un support unifié du Drag &amp; Drop </li>
<li> Le support de PostgreSQL </li>
<li> Le support de Win64 support (sauf le debugger) </li>
<li> une classe QuickTabs  </li>
<li> HeaderCtrl  peut maintenant déplacer les onglets </li>
<li> ArrayCtrl trie automatiquement les collones </li>
<li> Le Look&amp;feel de Chameleon a été amélioré sous GTK et Vista </li>
<li> la documentation (Topic++) fait maintenant partie intégrante de l&rsquo;IDE. </li>
</ul>
<p>Pour installer, rien de plus simple: des paquets sont disponibles. Il suffit de télécharger celui qui correspond à votre distribution. Au pire, il reste les sources à compiler.</p>
<p>Du coté des principaux regrets, on peut noter la structure du code de la bibliothèque, qui ressemble à celle de wxwidget (moi pro-Qt ? Nan, du tout) et un IDE qui semble, après un test rapide, ne pas être des plus ergonomique.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
