5 Stimmen

Was bedeutet diese Methodendeklaration/-definition (hat etwas mit der Übergabe eines Arrays zu tun)?

Hallo Ich stolperte durch Legacy-Code, und ich kam über eine wierd Methode Definition/Deklaration. Ich habe eine fundierte Vermutung, was es tut, aber ich kann noch nicht 100 % sicher sein.

Erklärung:

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

Definition

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

Meine beste Vermutung ist, dass es einen Verweis auf someMemberArray übergibt und dass es garantiert, dass es der Größe SOME_CONSTANT_VALUE ist, aber ich habe nie die [] Notation nach der Methodendeklaration gesehen, wie es erscheint, und es gibt so viele Klammern.

Jede Hilfe ist sehr willkommen.

7voto

CB Bailey Punkte 693084

Es ist die Erklärung eines const Mitgliedsfunktion, die keine Parameter benötigt und einen Verweis auf ein Array von SOME_CONSTANT_VALUE const SomeEnumeratedId s.

Es sieht leichter verständlich aus, wenn ein typedef .

typedef const SomeEnumeratedId SomeArrayType[SOME_CONSTANT_VALUE];

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

0voto

Diese seltsame Schreibweise ist, wie @Charles bereits dargelegt hat, die Deklaration/Definition einer konstanten Methode, die einen Verweis auf ein Array von Elementen zurückgibt, das als Mitglied gespeichert ist.

Die Syntax ist recht bizarr und könnte (und sollte wahrscheinlich) durch einen Typedef vereinfacht werden:

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

0voto

Ja, das ist eine Folge der völlig rückständigen Syntax der Typendeklaration von C. Es ist ähnlich wie, wenn Sie ein Array typedef tun, schreiben Sie diese: typedef int myArrayType[3]; , mit dem [3] nach dem neuen Typennamen, nicht nach dem ursprünglichen.

Wenn Sie wirklich clever sind, können Sie {std,tr1,boost}::array -- die man auf jeden Fall in Betracht ziehen sollte, so dass man am Ende ein Ergebnis hat:

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

stattdessen.

Die Umgehungslösungen mit typedefs (die in anderen Antworten untersucht wurden) sind verwandt, wenn auch nicht ganz gleichwertig, da {std,tr1,boost}::array sind Wrapper, nicht nur Typendefinitionen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X