<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Vitamina C++</title>
	<atom:link href="http://vitaminacpp.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://vitaminacpp.wordpress.com</link>
	<description></description>
	<lastBuildDate>Fri, 06 Jan 2012 09:40:39 +0000</lastBuildDate>
	<language>es</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='vitaminacpp.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://1.gravatar.com/blavatar/73158a3f4f671ae7d8fcea58b94b790c?s=96&#038;d=http%3A%2F%2Fs2.wp.com%2Fi%2Fbuttonw-com.png</url>
		<title>Vitamina C++</title>
		<link>http://vitaminacpp.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://vitaminacpp.wordpress.com/osd.xml" title="Vitamina C++" />
	<atom:link rel='hub' href='http://vitaminacpp.wordpress.com/?pushpress=hub'/>
		<item>
		<title>¿Qué es C++11? Historia del Lenguaje C++</title>
		<link>http://vitaminacpp.wordpress.com/2012/01/06/que-es-cpp11-historia-de-cpp/</link>
		<comments>http://vitaminacpp.wordpress.com/2012/01/06/que-es-cpp11-historia-de-cpp/#comments</comments>
		<pubDate>Thu, 05 Jan 2012 23:48:09 +0000</pubDate>
		<dc:creator>PaperBirdMaster</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[c++0x]]></category>
		<category><![CDATA[c++11]]></category>
		<category><![CDATA[Bjarne Stroustrup]]></category>
		<category><![CDATA[Dennis Ritchie]]></category>
		<category><![CDATA[Historia c++]]></category>
		<category><![CDATA[Ken Thompson]]></category>
		<category><![CDATA[Martin Richards]]></category>

		<guid isPermaLink="false">http://vitaminacpp.wordpress.com/?p=3</guid>
		<description><![CDATA[Ultimamente me paso el día hablando de C++11 con otros programadores, hablando de sus bondades y características pero, no todos los programadores de C++ saben lo que es; no todos están al día de las novedades en el mundo de la programación en general, ni las novedades en el mundo de C++ en concreto. Debo admitir [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vitaminacpp.wordpress.com&amp;blog=29717631&amp;post=3&amp;subd=vitaminacpp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ultimamente me paso el día hablando de C++11 con otros programadores, hablando de sus bondades y características pero, no todos los programadores de C++ saben lo que es; no todos están al día de las novedades en el mundo de la programación en general, ni las novedades en el mundo de C++ en concreto.</p>
<p>Debo admitir que cuando empecé a trabajar como programador, tampoco sabía lo que es un <a title="Definición de DIalecto de Lenguaje de Programación según Wikipedia." href="http://en.wikipedia.org/wiki/Dialect_(computing)" target="_blank">Dialecto de Lenguaje de Programación</a> ni que un lenguaje de programación evoluciona con el tiempo y es revisado continuamente por expertos para mejorarlo día a día.</p>
<p>Después de investigar y recoger información, puedo intentar responder a la pregunta:</p>
<h3><em>¿Qué es C++11?</em></h3>
<p>Es la cuarta revisión del Lenguaje de Programación C++, no se llama C++4 porque las revisiones no se numeran por el orden de revisión si no por el año en que los chicos de la <a title="Página de la Organización Internacional para la Estandarización en la Wikipedia." href="http://es.wikipedia.org/wiki/Organizaci%C3%B3n_Internacional_para_la_Estandarizaci%C3%B3n" target="_blank">Organización Internacional para la Estandarización (ISO)</a> dan el visto bueno a la revisión del lenguaje (también conocida como Dialecto del Lenguaje de Programación).</p>
<p>C++ ya tiene una larga historia; ya puestos a hablar de las revisiones  y cambios de C++ a lo largo del tiempo, tal vez podríamos pensar en profundizar el tema y preguntarnos</p>
<h3>¿Cómo empezó todo?. <span id="more-3"></span></h3>
<p>Los lenguajes de programación han ido evolucionando con los ordenadores, al fin y al cabo son la herramienta que nos permite trabajar con ellos; así que la historia nos remonta a la década de los 60, cuando los ordenadores estaban dando sus primeros pasos y con ellos los primeros pasos de los lenguajes de programación.</p>
<p>En esa década nos encontramos <a title="Entrada de la Wikipedia sobre el lenguaje de programación FORTRAN." href="http://es.wikipedia.org/wiki/Fortran" target="_blank">FORTRAN</a> como lenguaje diseñado específicamente para el cálculo numérico, computación científica&#8230; y nada más. Al ser un lenguaje con un único propósito era necesario tener alguna alternativa más genérica. Con ese objetivo se diseñó <a title="Entrada de la Wikipedia sobre el Lenguaje de Programación ALGOL." href="http://es.wikipedia.org/wiki/ALGOL" target="_blank">ALGOL</a> que por desgracia tampoco era práctico para crear aplicaciones comerciales y no llegó a tener mucho éxito, pero sirvió de inspiración para otros lenguajes procedurales posteriores como CPL, C y el propio C++.</p>
<p>En 1963 aparece el siguiente intento de crear un lenguaje de propósito general: el lenguaje <a title="Entrada de la Wikipedia sobre el Lenguaje de Programación CPL." href="http://es.wikipedia.org/wiki/Combined_Programming_Language">CPL</a>. Fue diseñado para cubrir las necesidades a las que ALGOL y FORTRAN no llegaban; pero seguía siendo demasiado específico a la par que era difícil de aprender, enseñar e implementar. Pero la idea era buena, así que en los siguientes años se dedicaron muchos esfuerzos a simplificarlo para hacer de CPL un lenguaje más práctico.</p>
<p>En 1967, <a title="Entrada de la Wikipedia sobre el creador de BCPL: Martin Richards." href="http://es.wikipedia.org/wiki/Martin_Richards">Martin Richards</a> desarrolló el lenguaje <a title="Entrada de la Wikipedia sobre el Lenguaje de Programación BCPL." href="http://es.wikipedia.org/wiki/BCPL" target="_blank">BCPL</a>, este lenguaje era una simplificación del lenguaje CPL sin perder sus características más importantes; añadió también la compilación en dos pasos que se popularizó en compiladores posteriores: el código se compilaba en código máquina para una máquina virtual que después era usado para compilar en el tipo de sistema deseado. Pero aún con las simplificaciones, mejoras y novedades seguía siendo demasiado abstracto y complicado.</p>
<p>En 1970, <a title="Entrada de la Wikipedia sobre el creador del Lenguaje B: Ken Thompson." href="http://es.wikipedia.org/wiki/Ken_Thompson" target="_blank">Ken Thompson</a>, durante el desarrollo de <a title="Entrada de la Wikipedia sobre el Sistema Operativo UNIX®." href="http://es.wikipedia.org/wiki/Unix" target="_blank">UNIX®</a>, creó el <a title="Entrada de la Wikipedia sobre el Lenguaje de Programación B." href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_B" target="_blank">Lenguaje B</a>. Se trataba de una simplificación de BCPL para hacerlo caber en equipos de la época. Inicialmente se desarrolló para un equipo y sistema operativo concretos (<a title="Entrada de la Wikipedia sobre el Minicimputador PDP-7." href="http://es.wikipedia.org/wiki/PDP-7" target="_blank">DEC PDP-7</a> bajo UNIX®) y sólo tenía un tipo de datos (valor entero del mismo tamaño que la palabra de procesador). Su mayor aporte fue la invención de los punteros y ser el precursor del Lenguaje C.</p>
<p>Durante 1971, <a title="Entrada de la Wikipedia sobre el creador del Lenguaje C: Dennis Ritchie." href="http://es.wikipedia.org/wiki/Dennis_Ritchie" target="_blank">Dennis Ritchie</a> siguió trabajando sobre el Lenguaje B. Se le añadieron nuevos tipos de datos, y mejoras en los array y punteros a datos. Esta colección de cambios se conoció durante un tiempo como &#8220;Nuevo B&#8221;; pero los cambios realizados eran tan importantes que no tenía sentido seguir llamándolo B, por lo que se le buscó un nuevo nombre, y así nació el <a title="Entrada de la Wikipedia sobre el Lenguaje de Programación C." href="http://es.wikipedia.org/wiki/Lenguaje_de_programaci%C3%B3n_C" target="_blank">Lenguaje C</a>.</p>
<p>En los siguientes años, la flexibilidad, velocidad y portabilidad de C contribuyeron a una rápida expansión del lenguaje, y en 1979 ya era un lenguaje ampliamente usado. Por ello, <a title="Entrada de la Wikipedia sobre el creador del Lenguaje C++: Bjarne Stroustrup." href="http://es.wikipedia.org/wiki/Bjarne_Stroustrup" target="_blank">Bjarne Stroustrup</a> lo tomó como base para añadirle una serie de mejoras. Quería mejorar C usando características de programación orientada a objetos inspiradas en <a title="Entrada de la Wikipedia sobre el primer Lenguaje de programación Orientado a Objetos (Simula)." href="http://es.wikipedia.org/wiki/Simula" target="_blank">Simula</a>. De otros lenguajes veteranos como <a title="Entrada de la Wikipedia sobre el Lenguaje de Programación ADA." href="http://es.wikipedia.org/wiki/Ada_(lenguaje_de_programaci%C3%B3n)" target="_blank">ADA</a>, <a title="Entrada de la Wikipedia sobre el Lenguaje de Programación CLU." href="http://es.wikipedia.org/wiki/CLU" target="_blank">CLU</a> y <a title="Entrada de la Wikipedia sobre el Lenguaje de Programación ML." href="http://es.wikipedia.org/wiki/Meta_Lenguaje" target="_blank">ML</a> obtuvo ideas como clases, herencia, tipado fuerte, funciones inline y argumentos por defecto.</p>
<p>Esta mejora de C sobre la que trabajaba Stroustrup era conocida como &#8220;Nuevo C&#8221; y durante la década de los 80, se fue refinando hasta transformarse en un lenguaje con identidad propia. En el proceso, perdió compatibilidad en algunos aspectos concretos con su predecesor, pero gracias a ello pudo desarrollar sus más importantes características. Al medida que el lenguaje &#8220;Nuevo C&#8221; se encaminaba hacia la programación orientada a objetos se le fue conociendo como &#8220;C con clases&#8221; hasta que, en 1983 se le cambió el nombre a &#8220;C++&#8221; de manera oficial.</p>
<p>El nuevo nombre se le atribuye a <a href="http://en.wikipedia.org/wiki/Rick_Mascitti">Rick Mascitti</a>, que lo usó por primera vez en diciembre de 1983 y según sus propias palabras se trata de un juego de palabras que combina el operador de incremento del Lenguaje C con la costumbre de añadir un &#8220;+&#8221; para etiquietar la versión superior de un programa; de esta manera se refleja que C++ es un paso adelante con respecto al Lenguaje C. Según el creador del lenguaje, Bjarne Stroustrup, considera dicho nombre como &#8220;una muestra de la naturaleza evolutiva de los cambios sobre C&#8221;.</p>
<p>El 14 de Octubre de 1985 se lanzó la primera implementación comercial de C++, la versión 2.0 de C++ vio la luz en 1989 y el año siguiente se publica &#8220;<a title="El Manual Anotado de Referencia de C++ en la página de Bjarne Stroustrup." href="http://www2.research.att.com/~bs/arm.html" target="_blank">The Annotated C++ Reference Manual</a>&#8220;, el cual acaba siendo la base del futuro estándar.</p>
<p>Para 1991 C++ había crecido ¡y mucho! se le habían añadido nuevas e interesantes funcionalidades como herencia múltiple, clases abstractas, funciones miembro estáticas, funciones miembro constantes y miembros protegidos. En los años siguientes, se siguió ampliando el lenguaje con plantillas, control de excepciones, espacios de nombres, nuevos transformadores de tipos y el tipo booleano.</p>
<p>Y en la década de los 90 empezamos la recta final de la historia de C++. En esta década el lenguaje fue considerado estándar y en 1998 ISO lo ratificó dando lugar al primer dialecto de C++ conocido como C++98.</p>
<p>A partir de la primera revisión del lenguaje, se van sucediendo periódicamente diferentes revisiones, en 2003 se aprueba la segunda revisión conocida como C++03.</p>
<p>Y en la década de los 2000, entran en juego los Technical Report, que son documentos mantenidos por los mayores eruditos del C++ en que se recopilan propuestas a incluir en la librería estándar. Los Technical Report no son parte del estándar de C++, pero muchas de sus propuestas acaban formando parte del mismo.</p>
<p>El primer <a title="Entrada de la Wikipedia sobre el primer Technical Report de C++ (Inglés)." href="http://en.wikipedia.org/wiki/C%2B%2B_Technical_Report_1" target="_blank">Technical Report</a>, publicado en 2005, propone múltiples añadidos al dialecto C++03, y en 2007 se publica un nuevo estándar que fue conocido como C++TR1 por incluir en el estándar parte de dicho documento.</p>
<p>Y finalmente llegamos a la cuarta revisión de C++, aprovada el 12 de Agosto de 2011. Esta nueva revisión ha sido muy esperada, a la vez que lenta y llena de retrasos. Como no se sabía exactamente cuándo iba a ser aprovada (se esperaba para 2008 o 2009), ha sido conocida durante mucho tiempo como C++0x, la idea era substituir la &#8220;x&#8221; por el dígito adecuado pero una vez llegados a 2010 se empezó a bromear afirmando que era una marca Hexadecimal. El apodo de C++0x se ha popularizado mucho, por lo que mucha de la información de C++11 puede ser encontrada bajo la etiqueta de C++0x.</p>
<div>Respecto a las revisiones anteriores, C++11 es más genérico, más uniforme y con mejores mecanismos de abstracción incluye tantas novedades respecto a los dialectos anteriores que hacen que C++11 casi parezca un nuevo C++.</div>
<h3>Hemos llegado hasta C++11 pero ¿Qué será lo siguiente?</h3>
<p>Parte de los retrasos sufridos por C++11 se deben a la gran cantidad de cambios que se querían hacer sobre el lenguaje y la librería estándar; cada cambio debe ser evaluado, discutido y aprovado por el comité de estándares y eso lleva su tiempo.</p>
<p>Así que algunos cambios propuestos quedaron en el tintero, en parte para no engordar más el Dialecto C++11 y en parte para no retrasar más su lanzamiento.</p>
<p>Los cambios que no llegaron a entrar en C++11 están siendo recopilados en un nuevo informe técnico, el &#8220;Technical Report 2&#8243;, que está previsto que se publique tras la aprobación de C++11 y muy posiblemente sea la base para un nuevo estándar de C++ en el futuro.</p>
<p>Por lo que, lo próximo que debemos esperar en cuanto a C++ es la publicación del &#8220;Technical Report 2&#8243; y una nueva ronda de reuniones del comité de estándares pero, mientras que lo primero será en breve, para lo segundo deberemos esperar unos años aún.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vitaminacpp.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vitaminacpp.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vitaminacpp.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vitaminacpp.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/vitaminacpp.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/vitaminacpp.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/vitaminacpp.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/vitaminacpp.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vitaminacpp.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vitaminacpp.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vitaminacpp.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vitaminacpp.wordpress.com/3/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vitaminacpp.wordpress.com/3/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vitaminacpp.wordpress.com/3/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vitaminacpp.wordpress.com&amp;blog=29717631&amp;post=3&amp;subd=vitaminacpp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://vitaminacpp.wordpress.com/2012/01/06/que-es-cpp11-historia-de-cpp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/893b76a946eb338e064f91688f166d61?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">PaperBirdMaster</media:title>
		</media:content>
	</item>
		<item>
		<title>Código más seguro con los nuevos Enumerados C++11</title>
		<link>http://vitaminacpp.wordpress.com/2011/11/27/enum-class-cpp11/</link>
		<comments>http://vitaminacpp.wordpress.com/2011/11/27/enum-class-cpp11/#comments</comments>
		<pubDate>Sun, 27 Nov 2011 19:15:29 +0000</pubDate>
		<dc:creator>PaperBirdMaster</dc:creator>
				<category><![CDATA[c++11]]></category>
		<category><![CDATA[enums]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[c++0x]]></category>
		<category><![CDATA[enum]]></category>
		<category><![CDATA[enum-class]]></category>

		<guid isPermaLink="false">http://vitaminacpp.wordpress.com/?p=9</guid>
		<description><![CDATA[C++11 ofrece algunas novedades enfocadas a producir código menos propenso a errores.  Usar estos nuevos mecanismos de control, nos ayudará a que el código sea más seguro, permitiendo entre otras cosas, detectar en tiempo de compilación errores que de otra manera, surgirían en tiempo de ejecución y consiguiendo también limitar los comportamientos inesperados. Entre las [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vitaminacpp.wordpress.com&amp;blog=29717631&amp;post=9&amp;subd=vitaminacpp&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>C++11 ofrece algunas novedades enfocadas a producir código menos propenso a errores.  Usar estos nuevos mecanismos de control, nos ayudará a que el código sea más seguro, permitiendo entre otras cosas, detectar en tiempo de compilación errores que de otra manera, surgirían en tiempo de ejecución y consiguiendo también limitar los comportamientos inesperados.</p>
<p>Entre las facilidades para hacer más seguro el código, encontramos varias enfocadas a cualificar adecuadamente los datos; esto es, evitar que un dato sea interpretado con un tipo cuando se espera otro o bien, que un tipo se convierta a otro sin control.</p>
<p>Una de estas novedades es el  nuevo tipo de  Enumerado C++11, el Enumerado-Clase (llamado así porque tiene características de Enumerado y de Clase).</p>
<p><span id="more-9"></span></p>
<p>Estos nuevos enumerados amplían la funcionalidad del enumerado tradicional permitiendo cualificar explícitamente sus miembros; no substituyen al enumerado tradicional si no que conviven con él, por lo que cualquier código previo a C++11 que haga uso de enumerados seguirá siendo válido.</p>
<p>Podemos ver un ejemplo de su uso y utilidad, al analizar código común hoy en día; por ejemplo, es común intentar forzar el rango de valores de un enumerado mediante un miembro de forzado:</p>
<pre><span style="color:#0000ff;"><strong>enum</strong></span> E_MY_FAVOURITE_FRUITS
<span style="color:#ff6600;"><strong>{</strong></span>
    E_APPLE        <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x01</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_WATERMELON   <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x02</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_COCONUT      <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x04</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_STRAWBERRY   <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x08</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_CHERRY       <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x10</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_PINEAPPLE    <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x20</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_BANANA       <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x40</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_MANGO        <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x80</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_MY_FAVOURITE_FRUITS_FORCE8 <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0xFF</strong></span> <span style="color:#008000;">// &lt;-- Forzamos a 8 bits.</span>
<span style="color:#ff6600;"><strong>};</strong></span></pre>
<p>La idea es que el último miembro (E_MY_FAVOURITE_FRUITS_FORCE_8_) indica el ancho de bits del enumerado (dato necesario para rutinas de serialización y deserialización, por ejemplo); pero el anterior estándar de C++ (conocido como C++03) no ofrece ningún control del ancho de bits de un enumerado ni ninguna manera fiable de garantizar que un valor de enumerado tenga un ancho de bits determinado.</p>
<p>Es más, la decisión del ancho de los datos de un enumerado ¡no es del programador! es algo que decidirá el compilador por nosotros, tal y como nos indica el estándar:</p>
<blockquote><p>“La expresión que define el valor de una constante de enumerado debe ser una expresión constante cuyo valor sea representable por int”.</p>
<p>“Todo enumerado debe ser compatible con char o cualquier entero con o sin signo. La elección del tipo es dependiente de implementación, pero debe ser capaz de representar el valor de todos los miembros del enumerado”.</p></blockquote>
<p>Por lo tanto, crear un miembro de forzado en el enumerado, además de que no garantiza que el tipo sea el esperado, requiere código extra (por lo que es incómodo de escribir y mantener) y dado que el compilador decide el ancho de bits del dato, si accidentalmente añadimos un nuevo miembro al enumerado que supere el valor de forzado ¡el compilador amplía el ancho de bits sin dar ningún aviso!</p>
<pre><span style="color:#0000ff;"><strong>enum</strong></span> E_MY_FAVOURITE_FRUITS
<span style="color:#ff6600;"><strong>{</strong></span>
    E_APPLE        <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x01</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_WATERMELON   <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x02</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_COCONUT      <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x04</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_STRAWBERRY   <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x08</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_CHERRY       <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x10</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_PINEAPPLE    <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x20</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_BANANA       <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x40</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_MANGO        <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x80</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_DEVIL_FRUIT  <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x100</strong></span><span style="color:#ff6600;"><strong>, </strong><span style="color:#008000;">// Nueva fruta, con valor mayor a 8 bits</span></span>
    E_MY_FAVOURITE_FRUITS_FORCE8 <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0xFF</strong></span> <span style="color:#008000;">// &lt;-- Forzamos a 8 bits.</span>
<span style="color:#ff6600;"><strong>};</strong></span></pre>
<p>Nuestro compilador, silenciosa y automáticamente cambiará el ancho de bits del enumerado porque  su nuevo miembro (E_DEVIL_FRUIT) ocupa 9 bits, así que deberá ser almacenado en un short o int ¡si es que no estaba ya almacenado en un entero!</p>
<p>Mal asunto, si usábamos el ancho de bits del enumerado para algún cálculo (por ejemplo, para rutinas de serialización y deserialización) a partir del la inclusión de E_DEVIL_FRUIT, ¡todos esos cálculos podrían ser erróneos!</p>
<p>Pero este no es el único comportamiento peculiar de los enumerados tradicionales, excepcionalmente y, a diferencia de las Clases y Estructuras, exportan sus nombres al espacio de nombres inmediatamente superior; si por ejemplo usamos el enumerado de frutas en un espacio de nombres:</p>
<pre><span style="color:#0000ff;"><strong>namespace</strong></span> Fruits
<span style="color:#ff6600;"><strong>{</strong></span>
<span style="color:#0000ff;"><strong>enum</strong></span> E_MY_FAVOURITE_FRUITS
<span style="color:#ff6600;"><strong>{</strong></span>
    E_APPLE        <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x01</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_WATERMELON   <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x02</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_COCONUT      <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x04</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_STRAWBERRY   <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x08</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_CHERRY       <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x10</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_PINEAPPLE    <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x20</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_BANANA       <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x40</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_MANGO        <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x80</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_DEVIL_FRUIT  <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x100</strong></span><span style="color:#ff6600;"><strong>,</strong></span>
    E_MY_FAVOURITE_FRUITS_FORCE8 <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0xFF</strong></span> <span style="color:#008000;">// &lt;-- Forzamos a 8 bits.</span>
<span style="color:#ff6600;"><strong>};</strong></span>
<span style="color:#ff6600;"><strong>} <span style="color:#008000;">// End namespace Fruits</span></strong></span></pre>
<p>No necesitaremos cualificar el nombre de la Fruta al completo para referirnos a ella; es decir, el nombre completo del identificador E_STAWBERRY será:</p>
<pre>Fruits::E_STRAWBERRY</pre>
<p>En lugar de:</p>
<pre>Fruits::E_MY_FAVOURITE_FRUITS::E_STRAWBERRY</pre>
<p>Este último es erróneo, porque E_MY_FAVOURITE_FRUITS no es una clase o espacio de nombres. Esto hace que sea mucho más cómodo trabajar con ellos, pero pueden dar un problema extra: Colisión de nombres.</p>
<pre><span style="color:#0000ff;"><strong>namespace</strong></span> Fruits
<span style="color:#ff6600;"><strong>{</strong></span>
<span style="color:#0000ff;"><strong>enum</strong></span> E_MY_FAVOURITE_FRUITS
<span style="color:#ff6600;"><strong>{</strong></span>
    E_APPLE        <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x01</strong></span><span style="color:#ff6600;"><strong>,</strong></span>  <span style="color:#008000;">// Fruits::E_APPLE</span>
    E_WATERMELON   <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x02</strong></span><span style="color:#ff6600;"><strong>,</strong></span>  <span style="color:#008000;">// Fruits::E_WATERMELON</span>
    E_COCONUT      <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x04</strong></span><span style="color:#ff6600;"><strong>,</strong></span>  <span style="color:#008000;">// Fruits::E_COCOUNUT</span>
    E_STRAWBERRY   <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x08</strong></span><span style="color:#ff6600;"><strong>,</strong></span>  <span style="color:#008000;">// Fruits::E_STRAWBERRY</span>
    E_CHERRY       <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x10</strong></span><span style="color:#ff6600;"><strong>,</strong></span>  <span style="color:#008000;">// Fruits::E_CHERRY</span>
    E_PINEAPPLE    <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x20</strong></span><span style="color:#ff6600;"><strong>,</strong></span>  <span style="color:#008000;">// Fruits::E_PINEAPPLE</span>
    E_BANANA       <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x40</strong></span><span style="color:#ff6600;"><strong>,</strong></span>  <span style="color:#008000;">// Fruits::E_BANANA</span>
    E_MANGO        <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x80</strong></span><span style="color:#ff6600;"><strong>,</strong></span>  <span style="color:#008000;">// Fruits::E_MANGO</span>
    E_DEVIL_FRUIT  <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0x100</strong></span><span style="color:#ff6600;"><strong>,</strong></span> <span style="color:#008000;">// Fruits::E_DEVIL_FRUIT</span>
    E_MY_FAVOURITE_FRUITS_FORCE8 <span style="color:#ff6600;"><strong>=</strong></span> <span style="color:#ff0000;"><strong>0xFF</strong></span> <span style="color:#008000;">// &lt;-- Forzamos a 8 bits.</span>
<span style="color:#ff6600;"><strong>};</strong></span>
<span style="color:#0000ff;"><strong>enum</strong></span> E_DEVIL_FRUIT <span style="color:#008000;">// Error! Fruits::E_DEVIL_FRUIT ya existe!</span>
<strong><span style="color:#ff6600;">{</span></strong>
    E_LOGIA<span style="color:#ff6600;"><strong>,</strong></span>
    E_PARAMECIA<span style="color:#ff6600;"><strong>,</strong></span>
    E_ZOAN<span style="color:#ff6600;"><strong>,</strong></span>
<strong><span style="color:#ff6600;">};</span> <span style="color:#ff6600;">}</span></strong> <span style="color:#008000;">// End namespace Fruits.</span></pre>
<p>Y para acabar, existe una  último comportamiento peculiar de los enumerados clásicos que los diferencia de las Clases y Estructuras:  ¡no se pueden pre-declarar!:</p>
<pre><span style="color:#0000ff;"><strong>enum</strong></span> E_DEVIL_FRUIT<span style="color:#ff6600;"><strong>;</strong></span> <span style="color:#008000;">// Error! declaracion incompleta.</span>
<span style="color:#008000;">// Error! tipo no definido.</span>
 <span style="color:#0000ff;"><strong>void</strong></span> EatDevilFruit(E_DEVIL_FRUIT <span style="color:#ff9900;"><strong>&amp;</strong></span>aType<span style="color:#ff9900;"><strong>,</strong></span> <strong><span style="color:#0000ff;">const</span> <span style="color:#0000ff;">char</span></strong> <span style="color:#ff9900;"><strong>*</strong></span>apName);
<span style="color:#0000ff;"><strong>enum</strong></span> E_DEVIL_FRUIT
<span style="color:#ff6600;">{</span>
    E_LOGIA<span style="color:#ff6600;"><strong>,</strong></span>
    E_PARAMECIA<span style="color:#ff6600;"><strong>,</strong></span>
    E_ZOAN<span style="color:#ff6600;"><strong>,</strong></span>
<span style="color:#ff6600;"><strong>};</strong></span></pre>
<p>Por suerte, llegan al rescate los Enumerados-Clase de C++11, tienen todo lo que sus hermanos mayores no tienen,  se les puede explicitar el tipo (asegurando el tamaño y evitando conversiones no deseadas) requieren cualificación completa de nombre (evitando colisiones de nombres) y se pueden Pre-declarar:</p>
<pre><span style="color:#0000ff;"><strong>namespace</strong></span> Fruits
{
<span style="color:#0000ff;"><strong>enum</strong> <strong>class</strong></span> E_DEVIL_FRUIT <span style="color:#ff9900;"><strong>:</strong></span> <strong><span style="color:#0000ff;">char</span></strong><span style="color:#ff9900;">;</span> <span style="color:#008000;">// Declaracion previa de Fruits::E_DEVIL_FRUIT.</span>
<span style="color:#0000ff;"><strong>enum</strong> <strong>class</strong></span> E_MY_FAVOURITE_FRUITS <span style="color:#ff9900;">:</span> <span style="color:#0000ff;"><strong>char</strong></span> <span style="color:#008000;">// Enumerado con tipo char.</span>
{
    E_APPLE        = <span style="color:#ff0000;"><strong>0x01</strong></span><span style="color:#ff9900;">,</span>
    E_WATERMELON   = <span style="color:#ff0000;"><strong>0x02</strong></span><span style="color:#ff9900;">,</span>
    E_COCONUT      = <span style="color:#ff0000;"><strong>0x04</strong></span><span style="color:#ff9900;">,</span>
    E_STRAWBERRY   = <span style="color:#ff0000;"><strong>0x08</strong></span><span style="color:#ff9900;">,</span>
    E_CHERRY       = <span style="color:#ff0000;"><strong>0x10</strong></span><span style="color:#ff9900;">,</span>
    E_PINEAPPLE    = <span style="color:#ff0000;"><strong>0x20</strong></span><span style="color:#ff9900;">,</span>
    E_BANANA       = <span style="color:#ff0000;"><strong>0x40</strong></span><span style="color:#ff9900;">,</span>
    E_MANGO        = <span style="color:#ff0000;"><strong>0x80</strong></span><span style="color:#ff9900;">,</span>
    E_DEVIL_FRUIT  = <span style="color:#ff0000;"><strong>0x100</strong></span><span style="color:#ff9900;">,</span> <span style="color:#008000;">// <a title="Documentación de Microsoft sobre el Warning C4309" href="http://msdn.microsoft.com/es-es/library/sz5z1byt(v=vs.71).aspx" target="_blank">Warning: Truncamiento de valor constante.</a></span>
    E_MY_FAVOURITE_FRUITS_FORCE8 = <span style="color:#ff0000;"><strong>0xFF</strong></span>
};
<span style="color:#008000;">// Se usa el enumerado pre-declarado!</span>
<span style="color:#0000ff;"><strong>void</strong></span> EatDevilFruit(E_DEVIL_FRUIT <span style="color:#ff9900;"><strong>&amp;</strong></span>aType<span style="color:#ff9900;"><strong>,</strong></span> <span style="color:#0000ff;"><strong>const</strong> <strong>char</strong></span> <span style="color:#ff9900;"><strong>*</strong></span>apName);
} <span style="color:#008000;">// End namespace Fruits.</span></pre>
<p>Podemos ver que los Enumerados-Clase nos han resuelto el mayor de los problemas de los enumerados tradicionales: la decisión del ancho de bits del dato ¡pasa a ser nuestra en lugar de ser algo que decidirá el compilador por nosotros!  Así que el identificador E_DEVIL_FRUIT de E_MY_FAVOURITE_FRUITS lanzará un Warning al compilar en lugar de pasar desapercibido ante nuestros ojos (podremos ignorar el Warning, ¡pero no podremos decir que no nos avisó!). También pasan a ser un dato pre-declarable, algo muy de agradecer.</p>
<p>La sintaxis de los Enumerados-Clase es muy parecida a la de las clases con herencia, usa la misma palabra clave y los dos puntos para referirse al tipo; también, al igual que las Clases y Estructuras,  requiere cualificación completa de nombre, esto hace que en ejemplo anterior, no nos diga que E_DEVIL_FRUIT es un identificador repetido:</p>
<pre><span style="color:#0000ff;"><strong>namespace</strong></span> Fruits
<span style="color:#ff6600;"><strong>{</strong></span>
<span style="color:#008000;">// Fruits::E_MY_FAVOURITE_FRUITS::E_DEVIL_FRUIT no es lo mismo que</span>
<span style="color:#008000;">// Fruits::E_DEVIL_FRUIT.</span>
<span style="color:#0000ff;"><strong>enum</strong> <strong>class</strong></span> E_DEVIL_FRUIT <span style="color:#ff6600;"><strong>:</strong></span> <span style="color:#0000ff;"><strong>char</strong></span>
{
    E_LOGIA<span style="color:#ff6600;"><strong>,</strong></span>
    E_PARAMECIA<span style="color:#ff6600;"><strong>,</strong></span>
    E_ZOAN<span style="color:#ff6600;"><strong>,</strong></span>
<span style="color:#ff6600;"><strong>};</strong></span>
<span style="color:#ff6600;"><strong>}</strong></span> <span style="color:#008000;">// End namespace Fruits.</span></pre>
<p>En definitiva, los nuevos Enumerados C++11 nos van a ayudar a tener un código más uniforme, más fácil de entender y menos propenso a errores ¡todo son ventajas! ¡empezad a usarlos!</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/vitaminacpp.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/vitaminacpp.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/vitaminacpp.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/vitaminacpp.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/vitaminacpp.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/vitaminacpp.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/vitaminacpp.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/vitaminacpp.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/vitaminacpp.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/vitaminacpp.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/vitaminacpp.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/vitaminacpp.wordpress.com/9/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/vitaminacpp.wordpress.com/9/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/vitaminacpp.wordpress.com/9/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=vitaminacpp.wordpress.com&amp;blog=29717631&amp;post=9&amp;subd=vitaminacpp&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://vitaminacpp.wordpress.com/2011/11/27/enum-class-cpp11/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/893b76a946eb338e064f91688f166d61?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">PaperBirdMaster</media:title>
		</media:content>
	</item>
	</channel>
</rss>
