2011-01-14 83 views
5

嗨,我在遗留代码中磕磕绊绊,我遇到了一个奇怪的方法定义/声明。我对它的作用有一个有教育的猜测,但我还不能100%确定。此方法声明/定义是什么意思? (与传递数组有关?)

声明:

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

定义

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

我最好的猜测是,它是传递一个参考someMemberArray,它是保证它的大小SOME_CONSTANT_VALUE的,但我从来没有见过方法声明出现后的[]符号,并且有很多圆括号。

任何帮助非常感谢。

回答

7

这是一个const成员函数的声明,它不接受任何参数,并返回一个对数组的引用SOME_CONSTANT_VALUEconstSomeEnumeratedId s。

typedef看起来更容易理解。

typedef const SomeEnumeratedId SomeArrayType[SOME_CONSTANT_VALUE]; 

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

那么方法告诉调用函数后,[SOME_CONSTANT_VALUE]返回的引用是否引用了该长度的数组?这是最让我困惑的部分,因为我从未在函数声明中看到过这一部分。我只看到数组作为引用或指针传递,最后没有。 – Michael 2011-01-14 16:14:25

0

即怪异符号,如@Charles已经指出的是,返回到存储为部件元件的阵列的基准的恒定方法的声明/定义。

的语法是相当奇怪的和可以(而且也许应该)通过一个typedef来简化:

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

是啊,这是C'S完全向后类型声明语法的结果。这与如何在执行数组typedef时类似,如下所示:typedef int myArrayType[3];[3]在新的类型名称之后,而不是原始名称。

如果你很聪明,你可以使用{std,tr1,boost}::array - 值得考虑的呢 - 让你最终有:

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

代替。

与typedefs(在其他答案中探讨)的解决方法是相关的,虽然不完全等效为{std,tr1,boost}::array是包装,而不仅仅是typedefs。