2011-01-14 10 views
5

Hola, estaba tropezando con el código heredado, y encontré una definición/declaración de método extraña. Tengo una idea aproximada de lo que hace, pero no puedo estar 100% seguro todavía.¿Qué significa esta declaración/definición de Método? (¿Tiene algo que ver con pasar una matriz?)

declaración:

const SomeEnumeratedId (&SomeMethod() const)[SOME_CONSTANT_VALUE]; 

definición

const SomeEnumeratedId (&SomeClass::SomeMethod() const)[SOME_CONSTANT_VALUE] 
{ 
    return someMemberArray; 
} 

Mi mejor conjetura es que está pasando una referencia a someMemberArray y que está garantizando que es de tamaño SOME_CONSTANT_VALUE, pero nunca he visto la notación [] después de la declaración del método tal como aparece, y hay tantos paréntesis.

Cualquier ayuda muy apreciada.

Respuesta

7

Es la declaración de una función const miembro de tomar sin parámetros y devolver una referencia a una matriz de SOME_CONSTANT_VALUEconstSomeEnumeratedId s.

Parece más fácil de entender con un typedef.

typedef const SomeEnumeratedId SomeArrayType[SOME_CONSTANT_VALUE]; 

SomeArrayType& SomeClass::SomeMethod() const 
{ 
    return someMemberArray; 
} 
+0

Entonces, ¿el [SOME_CONSTANT_VALUE] después del método le dice a la función de llamada que la referencia devuelta hace referencia a una matriz de esa longitud? Esa es la parte que más me confunde, ya que nunca he visto esa parte en una declaración de función. Solo he visto matrices pasadas como referencias o punteros sin eso al final. – Michael

+0

@Michael: Sí. Es parte de la declaración del tipo de devolución. –

+0

Wierd. Muchas gracias. – Michael

0

que la notación extraño, como @Charles ya ha señalado es la declaración/definición de un método constante que devuelve una referencia a una serie de elementos almacenados como miembro.

La sintaxis es bastante extraño y podría (y probablemente debería) ser simplificado por medio de un typedef:

typedef SomeEnumerated array_t[SOME_CONSTANT_VALUE]; 
const array_t& SomeMethod() const; 
0

Sí, es una consecuencia de la sintaxis de declaración de tipo completamente al revés de C. Es similar a cómo, al hacer una matriz typedef, escriba esto: typedef int myArrayType[3];, con [3] después del nuevo nombre de tipo, no el original.

Si usted es realmente inteligente puede utilizar {std,tr1,boost}::array - vale la pena considerar todos modos - de modo que usted termina con:

array<SomeEnumeratedId, SOME_CONSTANT_VALUE>& SomeClass::SomeMethod() const; 

lugar.

Las soluciones provisionales con typedefs (exploradas en otras respuestas) están relacionadas, aunque no son tan equivalentes como {std,tr1,boost}::array, son wrappers, no solo typedefs.

Cuestiones relacionadas