Что означает это объявление / определение метода?(что делать с передачей массива?) - PullRequest
5 голосов
/ 14 января 2011

Привет, я наткнулся на унаследованный код и наткнулся на определение / объявление странного метода. У меня есть обоснованное предположение о том, что он делает, но я пока не могу быть уверен на 100%.

Объявление:

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

определение

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

Мое лучшее предположение заключается в том, что он передает ссылку на someMemberArray и гарантирует, что он имеет размер SOME_CONSTANT_VALUE, но я никогда не видел нотацию [] после объявления метода в том виде, в котором он появляется, и существует так много скобок .

Любая помощь с благодарностью.

Ответы [ 3 ]

7 голосов
/ 14 января 2011

Это объявление функции-члена const, которая не принимает параметров и возвращает ссылку на массив SOME_CONSTANT_VALUE const SomeEnumeratedId s.

Это выглядит проще для понимания с typedef.

typedef const SomeEnumeratedId SomeArrayType[SOME_CONSTANT_VALUE];

SomeArrayType& SomeClass::SomeMethod() const
{
    return someMemberArray;
}
0 голосов
/ 14 января 2011

Да, это следствие полностью обратного синтаксиса объявления типа C. Это похоже на то, как при выполнении typedef для массива вы пишете: typedef int myArrayType[3];, с [3] после нового имени типа, а не с оригиналом.

Если вы действительно умны, вы можете использовать {std,tr1,boost}::array - в любом случае стоит подумать - так что в итоге вы получите:

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

вместо.

Обходные пути с typedefs (исследуются в других ответах) связаны, хотя и не совсем эквивалентны, поскольку {std,tr1,boost}::array являются обертками, а не просто typedefs.

0 голосов
/ 14 января 2011

Эта странная запись, как @Charles уже указывал, является объявлением / определением постоянного метода, который возвращает ссылку на массив элементов, хранящихся в качестве члена.

Синтаксис довольно причудлив и может(и, вероятно, должно быть) упрощен с помощью typedef:

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