2010-10-26 16 views
10

Todavía me estoy ganando mis alas C++; Mi pregunta es si tengo una estructura así:C++ initialize anonymous struct

struct Height 
{ 
    int feet; 
    int inches; 
}; 

Y luego tengo algunas líneas de este modo:

Height h = {5, 7}; 
Person p("John Doe", 42, "Blonde", "Blue", h); 

me gusta la inicialización de estructuras a través de las llaves, pero prefiero la arriba, estar en una línea, en una Estructura de Altura anónima. ¿Cómo hago esto? Mi enfoque ingenuo inicial fue:

Person p("John Doe", 42, "Blonde", "Blue", Height{5,7}); 

Esto no funcionó sin embargo. ¿Estoy muy lejos de la marca?

+4

esto puede ser simplemente un ejemplo, pero, probablemente es mejor almacenar la altura característica '' como un único campo inches'. Cuando necesitas pies puedes convertir eso en pies; es mucho más fácil tratar con una sola unidad que hacer malabarismos con varias unidades, especialmente porque como ahora puedes tener múltiples valores que son iguales pero que no tienen la misma representación (por ejemplo, '{2, 3}' y '{ 1, 15} '). –

+1

C++ 1x viene con [sintaxis de inicialización uniforme] (http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization) que sería compatible con algo como esto. Es bastante probable que su compilador ya lo admita. – sbi

+2

En lugar de 'Altura {5,7}' en el constructor de Persona, especifique '(struct Height) {5,7}' (si pasa por referencia) (o '& (struct Height) {5,7} 'si estás pasando un puntero). Básicamente estás lanzando la lista de inicializadores al tipo deseado. Es una característica C99 +, pero también debe ser utilizable con C++. – Erhhung

Respuesta

15

No puede, al menos no en C++ actual; la inicialización del paréntesis es parte de la sintaxis del inicializador y no se puede usar en ningún otro lugar.

Puede agregar un constructor para Height:

struct Height 
{ 
    Height(int f, int i) : feet(f), inches(i) { } 
    int feet, inches; 
}; 

Esto le permite utilizar:

Person p("John Doe", 42, "Blonde", "Blue", Height(5, 7)); 

Por desgracia, ya Height ya no es un agregado, ya no se puede utilizar la inicialización del corsé . La inicialización de llamada al constructor es tan fácil, sin embargo:

Height h(5, 7); 
+0

aseado. No sabía que las estructuras podrían tener constructores/listas de inicializadores. –

+10

@byte: una 'struct' es exactamente lo mismo que una' clase'. La única diferencia es que las clases base y los miembros son públicos por defecto para una 'struct' y privadas para una' clase'. –

4

estándar de C++ (C++ 98, C++ 03) no es compatible con esto.

g ++ supports es una extensión de idioma, y ​​parece recordar que C++ 0x lo admitirá. Debería verificar la sintaxis de la extensión del lenguaje g ++ y/o posiblemente C++ 0x.

Para la versión estándar de C++, solo asigne el nombre a la instancia Height, como ya lo hizo, y luego use el nombre.

Saludos & HTH.,

+0

¿Se proporciona automáticamente, o tiene que definir un constructor que acepte un argumento 'initializer_list'? –

+0

@Ben: no, no tiene que definir un constructor para obtener la sintaxis de C++ 0x. gran parte del objetivo/punto es tener una sintaxis * uniforme * que funcione igual en la mayoría de las situaciones. echa un vistazo al [enlace de Wikipedia] (http://en.wikipedia.org/wiki/C%2B%2B0x#Uniform_initialization) dado por @sbi anteriormente.O, si desea los detalles, el último borrador está disponible en las [páginas del comité C++] (http://www.open-std.org/jtc1/sc22/wg21/), en formato PDF. –